标签: android-architecture-components

LiveData 不会将数据从一个活动更新到另一个活动 - Android

我有 2 个Activity可视化

  1. 列表 Activity
  2. 细节 Activity

该列表Activity显示项目列表,并Activity在单击列表中的项目时显示详细信息。在ListActivity我们观察从数据库获取提要后,我们会更新 UI。

列表页面

feedViewModel.getFeeds().observe(this, Observer { feeds ->
      feeds?.apply {
            feedAdapter.swap(feeds)
            feedAdapter.notifyDataSetChanged()
      }
})
Run Code Online (Sandbox Code Playgroud)

现在我们有一个DetailActivity更新提要(项目)并Activity完成的页面,但更改未反映在ListActivity.

详情页面

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        feedViewModel.setFeedId(id)
        feedViewModel.updateFeed()
}
Run Code Online (Sandbox Code Playgroud)

饲料视图模型

class FeedViewModel(application: Application) : AndroidViewModel(application) {


    private val feedRepository = FeedRepository(FeedService.create(getToken(getApplication())),
            DatabaseCreator(application).database.feedDao())

    /**
     * Holds the id of the feed
     */
    private val feedId: MutableLiveData<Long> = MutableLiveData()

    /**
     * Complete list of feeds …
Run Code Online (Sandbox Code Playgroud)

android android-room android-livedata android-architecture-components

4
推荐指数
1
解决办法
3274
查看次数

在 Android Room Library 中使用 Singleton

我一直被告知使用 Singleton 是不好的。但是,Android Room 实现的每个示例似乎都使用单例方法。有人可以解释为什么会这样吗?

谢谢

android design-patterns android-room android-livedata android-architecture-components

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

从 LiveData 触发第二个查询并合并结果(Firestore)?

我有两个集合:用户和书籍。无论用户或书籍是否更新,我都需要获取它们的结果,然后将结果合并到 LinkedHashMap 中以用作 listView 菜单。

我认为 MediatorLiveData 将是可行的方法,但是如果我将用户查询和书籍查询放入,那么我会从两个 LiveData 对象之一中获取空值,因为只有一个或另一个触发。我想也许如果其中一个触发,那么也许我在 MediatorLiveData 的每个 addSource() 中运行了一个查询,但我不确定这是否可行。

我的关于 MediatorLiveData 的帖子在这里: 使用 MediatorLiveData 合并到 LiveData (Firestore) QuerySnapshot 流正在产生奇怪的结果

我的两个查询和 LiveData 对象如下:

//getUsers query using FirebaseQueryLiveData class
private Query getUsersQuery() {
    FirebaseAuth mAuth = FirebaseAuth.getInstance();

    adminID = mAuth.getUid();
    query = FirebaseFirestore.getInstance().collection("admins")
            .document(adminID)
            .collection("users")
    return query;
}

private FirebaseQueryLiveData usersLiveData = new FirebaseQueryLiveData(getUsersQuery());


//getBooks query using FirebaseQueryLiveData class
private Query getBooksQuery () {
    FirebaseGroupID firebaseGroupID = new FirebaseGroupID(getApplication());
    groupID = firebaseGroupID.getGroupID();
    query = FirebaseFirestore.getInstance().collection("books")
            .whereEqualTo("groupID", groupID) …
Run Code Online (Sandbox Code Playgroud)

android firebase android-livedata android-architecture-components google-cloud-firestore

4
推荐指数
1
解决办法
2016
查看次数

带参数或操作的目标必须具有"name"或"id"属性

我使用Google导航创建了全局操作.编译代码时出现以下错误

<navigation 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"
app:startDestination="@id/homeEnumerationFragment">

<fragment
    android:id="@+id/homeEnumerationFragment"
    android:name="org.southasia.ghru.ui.homeenumeration.HomeEnumerationFragment"
    android:label="HomeEnumerationFragment"
    tools:layout="@layout/home_enumeration_fragment"></fragment>


<fragment
    android:id="@+id/stationFragments"
    android:name="org.southasia.ghru.ui.station.StationFragment"
    android:label="StationFragment"
    tools:layout="@layout/station_fragment"/>

<fragment
    android:id="@+id/devicesFragment"
    android:name="org.southasia.ghru.ui.devices.DevicesFragment"
    android:label="DevicesFragment"
    tools:layout="@layout/devices_fragment"/>
<action android:id="@+id/action_global_stationFragments3" app:destination="@+id/stationFragments"/>
Run Code Online (Sandbox Code Playgroud)

错误错误:带参数或操作的目标必须具有"name"或"id"属性.

android android-architecture-components

4
推荐指数
1
解决办法
669
查看次数

Android BottomNavigation 未使用导航控制器正确突出显示

我正在尝试从 Android 架构组件实现Nagivation。我能够在我的片段中成功导航。我试图将它附加到我的底部导航,但我无法正确使用它。我可以成功地在片段之间导航,Navigation.findNavController(View).navigate(R.id.Fragment)但是当我使用任何 UI 组件或后退按钮执行此操作时,底部导航中的突出显示不会更改,如下面的 gif 所示

在此处输入图片说明

我的代码如下MainActivity.kt

class MainActivity : AppCompatActivity() {


    private lateinit var navController: NavController


    private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.navigation_home -> {
                navController.navigate(R.id.homeFragment)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_dashboard -> {
                navController.navigate(R.id.addEmotionFragment)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_notifications -> {
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        navController = Navigation.findNavController(this, R.id.nav_host)
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
    }


}
Run Code Online (Sandbox Code Playgroud)

为了 HomeFragment.kt

class HomeFragment : Fragment() {

    override …
Run Code Online (Sandbox Code Playgroud)

android bottomnavigationview android-architecture-components android-jetpack android-architecture-navigation

4
推荐指数
1
解决办法
1507
查看次数

如何在room dao查询中连接字符串?

我在查询中使用 LIKE 运算符

 @Query("SELECT * FROM item where barcodes LIKE :barcode")
 List<Item> getItemWithBarcode(String barcode);
Run Code Online (Sandbox Code Playgroud)

有什么办法可以appendedTxt在条形码上附加一些东西()吗?像这样

@Query("SELECT * FROM item where barcodes LIKE (:barcode + 'appendedTxt')")
List<Item> getItemWithBarcode(String barcode);
Run Code Online (Sandbox Code Playgroud)

android android-room android-architecture-components

4
推荐指数
1
解决办法
1361
查看次数

使用 ViewModel 的接口?

我目前正在根据官方文档和谷歌提供的示例应用程序(向日葵和 todo-app)将架构组件集成到我的应用程序中。我意识到这些都没有使用ViewModel接口(向日葵应用程序甚至不使用存储库接口)。

我的问题是:省略ViewModels的接口是否合理(包括优点和缺点)?

android design-patterns interface android-viewmodel android-architecture-components

4
推荐指数
1
解决办法
2440
查看次数

如果我点击导航控制器中的菜单,如何在两个片段目的地之间传递数据?

我正在尝试使用导航控制器。我有一个底部导航视图。位于我的 MainActivity 上,它是使用以下代码启动的:

class MainActivity : AppCompatActivity() {

    lateinit var navController : NavController
    lateinit var logoHeaderImageView : ImageView
    var toolbarMenu : Menu? = null


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        logoHeaderImageView = findViewById(R.id.header_lakuin_image_view)

        navController = Navigation.findNavController(this,R.id.nav_main_host_fragment)



        setupBottomNavMenu(navController)
        setupActionBar(navController)



    }

    fun setupBottomNavMenu(navController: NavController) {
        NavigationUI.setupWithNavController(bottom_navigation_view,navController)
    }

    fun setupActionBar(navController: NavController) {
        setSupportActionBar(main_activity_toolbar)
        main_activity_toolbar.title = ""


        val appBarConfiguration = AppBarConfiguration(
            setOf(
                // set some destination as the top hierarchy destination, to make the up button doesn't show.
                R.id.destination_home,
                R.id.destination_order,
                R.id.destination_favourite,
                R.id.destination_cart,
                R.id.destination_profile …
Run Code Online (Sandbox Code Playgroud)

android android-navigation android-architecture-components android-jetpack android-architecture-navigation

4
推荐指数
1
解决办法
4506
查看次数

为什么我的片段没有显示在导航控制器中?

我是使用 Android 导航控制器的新手。

这是我的主要活动的 xml:

<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".Activities.MainActivity">

    <androidx.appcompat.widget.Toolbar
            android:id="@+id/main_activity_toolbar"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:minHeight="?attr/actionBarSize"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:elevation="4dp" app:layout_constraintHorizontal_bias="0.0">
    </androidx.appcompat.widget.Toolbar>

    <fragment
            android:id="@+id/nav_main_host_fragment"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintBottom_toTopOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/main_activity_toolbar"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:name="androidx.navigation.fragment.NavHostFragment"
            app:navGraph="@navigation/main_graph"
            app:defaultNavHost="true"
    />

</androidx.constraintlayout.widget.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

我的 kotlin 主要活动:

class MainActivity : AppCompatActivity(),NavController.OnDestinationChangedListener {
    lateinit var navController : NavController

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        navController = Navigation.findNavController(this,R.id.nav_main_host_fragment)
        navController.addOnDestinationChangedListener(this)

        setupActionBar()
    }

    override fun onDestinationChanged(
        controller: NavController,
        destination: NavDestination,
        arguments: Bundle?) {
    }

    private fun setupActionBar() {
        setSupportActionBar(main_activity_toolbar)
        supportActionBar?.title …
Run Code Online (Sandbox Code Playgroud)

android android-navigation android-architecture-components android-jetpack android-architecture-navigation

4
推荐指数
1
解决办法
3854
查看次数

在 Android 的 Repository 或 ViewModel 中使用共享的 Preference 值

ArchitectureComponents在我的应用程序中使用。我正在使用 ActivityMain 中的 ViewModel发出API请求ViewModel并将数据设置为RecyclerView使用 ViewModel。为了进行 Api 调用,我需要一个Token保存在SharedPreference.I 中的令牌。我需要获取该令牌并将其添加到标题中,同时发出请求。哪里以及如何获取 SharedPreference 值。它应该在 ViewModel 或 Repository 中。
这是我的代码ViewModel

public class FoodieViewModel extends AndroidViewModel {
   FoodieRepository repository;
   MutableLiveData<ArrayList<Foodie>> foodieList;
    public FoodieViewModel(@NonNull Application application) {
        super(application);
        repository=new FoodieRepository(application);
    }

     LiveData<ArrayList<Foodie>> getAllFoodie(){
        if(foodieList==null){
            foodieList=new MutableLiveData<ArrayList<Foodie>>();
            loadFoodies();
        }
        return foodieList;
    }
    public void loadFoodies(){
        String url="somethimg.com";
        JsonArrayRequest request =new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                ArrayList<Foodie> list=new ArrayList<>(); …
Run Code Online (Sandbox Code Playgroud)

android sharedpreferences android-recyclerview android-architecture-components

4
推荐指数
1
解决办法
5712
查看次数