我有一个项目,在其中我已经成功实现了位置跟踪功能,并且运行良好。我每 30 秒使用融合位置提供程序跟踪用户当前位置。(跟踪在 MainActivity 启动时开始)。
现在我计划使用新引入的 Android 架构组件来更新该项目。但我不知道如何使用视图模型实现位置跟踪。在MainActivity 或 Application类中,哪里是开始位置跟踪的正确位置?我应该使用ViewModel 还是 AndroidViewModel?如何实现这一目标。
android fusedlocationproviderapi android-livedata android-viewmodel android-architecture-components
我在过去的两天里遇到了这个问题,我无法确定我在这里做错了什么。
情况是:我使用 Retrofit (POST 方法调用)将 2 个参数传递给我的 API,第一个参数是Token,第二个参数是CompanyId。我得到了大约 700 多个数据作为列表(JSON 响应)。所以我尝试实现 Android 架构的分页库来接收该列表中的 20 个项目。
然后,当加载 20 个项目时,再加载 20 个项目,以便我比平常更快地收到回复。
我的假设:我认为我的 API 的服务器页面没有分页。
我的问题是:是否可以在不分页 API 的情况下从 700 多个项目的列表中接收 20 个项目。
每次调用 API 时,加载 700 多个项目都需要花费太多时间。
在这种情况下如何使用分页库?
如果您需要我的代码的任何块,您可以在下面的评论中请求。
任何帮助将不胜感激,谢谢。
android android-recyclerview android-architecture-components android-paging
我知道为了将自定义参数传递给ViewModel,我们可以使用ViewModelProvider.NewInstanceFactory,如下所示:
// Factory Class
class MyFactory extends ViewModelProvider.NewInstanceFactory {
private final String mId;
public MyFactory(String id) {
mId = id;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
return (T) new MyViewModel(mId);
}
}
// MyViewModel class
class MyViewModel extends ViewModel {
public MyViewModel(String id) {
...
}
}
// Activity I can Initialise as:
MyFactory modelFactory = new MyFactory(id);
viewModel = ViewModelProviders.of(this, modelFactory).get(MyViewModel.class);
Run Code Online (Sandbox Code Playgroud)
如何使用AndroidViewModel子类中的自定义参数以及应用程序上下文来实现相同的效果。喜欢
// MyAndroidViewModel class
class MyAndroidViewModel …Run Code Online (Sandbox Code Playgroud) java android android-viewmodel android-architecture-components
我有一个活动,CoordinatorLayout其中包含一个CollapsingToolbarLayout. 我已将活动的标题绑定到 的title属性CollapsingToolbarLayout,如下所示(由于布局太大,仅发布代码的相关部分):
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable name="viewModel"
type="com.android.myapp.ui.activity.home.HomeActivityViewModel"/>
</data>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusableInTouchMode="true">
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="com.android.myapp.ui.behavior.scroll.appbar.DisableableAppBarLayoutBehavior"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:title="@{viewModel.pageTitle}"
app:collapsedTitleTextAppearance="@style/CollapsedAppBarTitleStyle"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleGravity="bottom|center_horizontal"
app:expandedTitleMarginBottom="85dp"
app:expandedTitleTextAppearance="@style/ExpandedAppBarTitleStyle"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<!--Remaining layout-->
</layout>
Run Code Online (Sandbox Code Playgroud)
如您所见,该pageTitle属性绑定到 xmlCollapsingToolbarLayout title属性。
现在在HomeActivityViewModel:
class HomeActivityViewModel(application: Application) : AndroidViewModel(application) {
var isToolbarExpandable = MutableLiveData<Boolean>() // For handling the …Run Code Online (Sandbox Code Playgroud) android android-databinding android-livedata android-viewmodel android-architecture-components
无法找到导致空异常问题的原因。按照指南制作项目,它没有这个问题。使用与 guidr 相同的库版本。
错误信息
Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setTitle(java.lang.CharSequence)' on a null object reference
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setTitle(java.lang.CharSequence)' on a null object reference
Run Code Online (Sandbox Code Playgroud)
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.navigation.NavController
import androidx.navigation.Navigation
import androidx.navigation.ui.NavigationUI
import androidx.navigation.ui.setupWithNavController
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
navController = Navigation.findNavController(this, R.id.nav_host_fragment)
bottom_nav.setupWithNavController(navController)
NavigationUI.setupActionBarWithNavController(this, navController)
}
override fun onSupportNavigateUp(): Boolean {
return NavigationUI.navigateUp( navController, null)
} …Run Code Online (Sandbox Code Playgroud) navigation android uinavigationcontroller android-architecture-components
我的应用程序在LinkageError使用lazy{}. 崩溃仅在以下情况发生:
minifyEnabledtrue在 build.gradle 中设置为,并且 lifecycle-2.0.0与minifyEnabled def lifecycle_version = '2.1.0'
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
Run Code Online (Sandbox Code Playgroud)
此外,崩溃仅发生在其中一个视图模型上。在此之前触摸的同一活动中的其他视图模型不会使应用程序崩溃。
崩溃发生在这里的第二行:
private val searchStackViewModel by lazy {
ViewModelProviders.of(this)[SearchStateViewModel::class.java]
}
Run Code Online (Sandbox Code Playgroud)
该SearchStateViewModel是:
class SearchStateViewModel : ViewModel() {
// Live data that initialises to empty stack with SearchStack.init
private val privateStack = MutableLiveData<SearchStack>().apply {
value = SearchStack()
}
// Observable view of search stack so it can't be directly modified
internal val stateStack : LiveData<SearchStack> …Run Code Online (Sandbox Code Playgroud) android android-architecture-lifecycle android-viewmodel android-architecture-components android-jetpack
是否可以在观察者内部使用协同程序来更新 UI?
例如:
Viewmodel.data.observer(this, Observer{ coroutinescope })
Run Code Online (Sandbox Code Playgroud) android kotlin android-architecture-components kotlin-coroutines
我正在尝试创建一个房间数据库,我希望插入其中的每个项目都有自己唯一的 ID,而无需我提供它,问题是当我尝试将新项目插入数据库时,出现错误,要求我提供一个 ID。
这是我的实体:
@Entity(tableName = "notes_table")
data class Note(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
@ColumnInfo(name = "description")
val description: String,
@ColumnInfo(name = "priority")
var priority: Int)
Run Code Online (Sandbox Code Playgroud)
有没有办法让数据库创建自己的自动生成的自动递增 id 列,而无需我像这样添加它:
val item = Note(id, item, priority)
insert(item)
Run Code Online (Sandbox Code Playgroud)
而是这样做:
val item = Note(item, priority)
insert(item)
Run Code Online (Sandbox Code Playgroud) 我知道可以在源片段中使用 Action 传递单个参数
override fun onClick(v: View) {
val amountTv: EditText = view!!.findViewById(R.id.editTextAmount)
val amount = amountTv.text.toString().toInt()
val action = SpecifyAmountFragmentDirections.confirmationAction(amount)
v.findNavController().navigate(action)
}
Run Code Online (Sandbox Code Playgroud)
并按照 android 文档中指定的方式在目标片段中获取它
val args: ConfirmationFragmentArgs by navArgs()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val tv: TextView = view.findViewById(R.id.textViewAmount)
val amount = args.amount
tv.text = amount.toString()
}
Run Code Online (Sandbox Code Playgroud)
请让我知道是否有任何方法可以以 TypeSafe 方式传递多个参数
android android-navigation android-architecture-components android-jetpack
我是 MVVM 新手。因此,我的片段/活动向服务器发出了 2 个请求,第一个请求的结果将用作第二个请求的输入参数。
因此,首先在我的片段中,当单击按钮时,我会发出请求以检查用户是否被禁止,如果没有,则该用户可以创建帖子。
所以首先我检查用户是否被禁止或没有在我的片段中使用此代码
class CreateEventFragment : Fragment() {
lateinit var model: CreateEventViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
model = ViewModelProvider(this).get(CreateEventViewModel::class.java)
button.setOnClickListener {
model.checkIfUserIsBanned()
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是视图模型
class CreateEventViewModel(application: Application) : AndroidViewModel(application) {
val mUserIsBanned :MutableLiveData<Boolean> = UserClient.mUserIsBanned
fun checkIfUserIsBanned(userID: String) {
UserRepository.checkIfUserIsBanned(id)
}
}
Run Code Online (Sandbox Code Playgroud)
这是客户端(为了简单起见,我跳过了存储库)
object UserClient {
val mUserIsBanned = MutableLiveData<Boolean>()
fun checkIfUserIsBanned(userID: String) {
// perform networking, after getting the value then
if (user.isBanned) {
mUserIsBanned.postValue(true) …Run Code Online (Sandbox Code Playgroud) android kotlin android-livedata android-viewmodel android-architecture-components
android ×10
android-architecture-components ×10
kotlin ×2
android-architecture-lifecycle ×1
android-room ×1
java ×1
navigation ×1
sqlite ×1