标签: android-architecture-components

如何使用新的架构组件跟踪 android 中的当前位置?

我有一个项目,在其中我已经成功实现了位置跟踪功能,并且运行良好。我每 30 秒使用融合位置提供程序跟踪用户当前位置。(跟踪在 MainActivity 启动时开始)。

现在我计划使用新引入的 Android 架构组件来更新该项目。但我不知道如何使用视图模型实现位置跟踪。在MainActivity 或 Application类中,哪里是开始位置跟踪的正确位置?我应该使用ViewModel 还是 AndroidViewModel?如何实现这一目标。

android fusedlocationproviderapi android-livedata android-viewmodel android-architecture-components

3
推荐指数
1
解决办法
6195
查看次数

如何在没有服务器端分页的情况下在android中使用分页?

我在过去的两天里遇到了这个问题,我无法确定我在这里做错了什么。

情况是:我使用 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

3
推荐指数
1
解决办法
2019
查看次数

如何使用 Factory 将自定义参数传递给 ViewModel?

我知道为了将自定义参数传递给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

3
推荐指数
1
解决办法
1万
查看次数

MutableLiveData 的 Android XML 绑定不起作用

我有一个活动,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

3
推荐指数
1
解决办法
1642
查看次数

在 NavigationUI 上执行命令时出现 NullPointerException

无法找到导致空异常问题的原因。按照指南制作项目,它没有这个问题。使用与 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

3
推荐指数
1
解决办法
2407
查看次数

仅在 minifyEnabled 和 LifeCycle v 2.1.0 时创建 ViewModel 时应用程序崩溃

我的应用程序在LinkageError使用lazy{}. 崩溃仅在以下情况发生:

  1. minifyEnabledtrue在 build.gradle 中设置为,并且
  2. 我使用版本。2.1.0生命周期组件。它lifecycle-2.0.0minifyEnabled
    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

3
推荐指数
1
解决办法
1062
查看次数

Android Livedata Observer Coroutine Kotlin

是否可以在观察者内部使用协同程序来更新 UI?

例如:

Viewmodel.data.observer(this, Observer{ coroutinescope })
Run Code Online (Sandbox Code Playgroud)

android kotlin android-architecture-components kotlin-coroutines

3
推荐指数
1
解决办法
2346
查看次数

如何在不提供 id 的情况下自动生成 Room 数据库 id

我正在尝试创建一个房间数据库,我希望插入其中的每个项目都有自己唯一的 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)

sqlite android android-room android-architecture-components

3
推荐指数
1
解决办法
1881
查看次数

在导航中使用 TypeSafe 将多个参数传递给片段

我知道可以在源片段中使用 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

3
推荐指数
1
解决办法
4222
查看次数

我可以在我的视图模型中创建一个实时数据观察器吗?或者我应该始终观察片段/活动?

我是 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

3
推荐指数
1
解决办法
1万
查看次数