动态创建首选项时,无法通过键滚动到特定首选项

问题描述

我正在尝试使用Android tutorial来构建设置屏幕。在我的PreferenceCompatFragment子类中,我需要完成以下任务。

  1. 通过进行服务调用从后端获取首选项。
  2. 创建首选项对象以将其显示在屏幕上
  3. 如果意图中提供了首选项键,请滚动到特定的首选项。

任务3不能按预期工作,我希望有人可以告诉我我做错了什么。

我的实现如下:

片段

class MyPreferencesFragment : PreferenceFragmentCompat() {

    . . . . .  Other methods . . . . . 

     @Override
     fun onActivityCreated(savedInstanceState: Bundle?) {
          val viewmodel = viewmodelProvider(this).get(Myviewmodel::class.java)
          val screen = getPreferenceScreen()
          val preferencesCategory = PreferenceCategory(preferenceManager.context)
          viewmodel.fetchedPreferences.observe(this,Observer {
              preferencesList -> 

               preferencesList?.forEach {
                  Preference preference = CheckBoxPreference(preferenceManager.context)
                  preference.title = it.title
                  preference.key = it.key
                  preference.summary = it.summary
                  preferenceCategory.addPreference(preference);
               }
          }
          viewmodel.fetchServerPreferences("HomePage");
          screen.addPreference(preferencesCategory)

          // Call scrolling function
          callScrollingFunction()
     }

     private fun callScrollingFunction() {
       val preferencetobedeepLinked = activity?.intent?.getStringExtra("preference");
       if (preferencetobedeepLinked.isNullOrEmpty()) {
         return
       }
       scrollToPreference(preferencetobedeepLinked);  // This does not work.
     }

     @Override
     fun onCreatePreferences(savedInstance: Bundle?,roottag: String?) {
         val context = preferenceManager.context
         preferenceScreen = preferenceManager.createPreferenceScreen(context)
     }
}

PreferenceValueData

data class PreferenceValueData(val key: String,val title: String,val summary: String)

查看模型

class Myviewmodel: viewmodel() {
   val repository;
   init {
       repository = MyRepository() // Invokes the service
   }
   private _preferenceLiveData = mutablelivedata<List<PreferenceValueData>>()
   
  fetchedPreferences : LiveData<List<PreferenceValueData>>
      get() = _preferenceLiveData

   /** Fetches preferences for a page **/
   fun fetchServerPreferences(page: String) {
      viewmodelScope.launch {
         val preferences: List<PreferenceValueData> = repository.fetchPreferences(page) // Invokes the service in a dispatch.IO context and returns the response. This works
          fetchedPreferences.value = if (!preferences.isNullOrEmpty()) ? preferences: null
      }
   }

}

从后端获取首选项会导致一定程度的延迟。在致电scrollToPreference之前,如何确保已创建首选项?我已经能够确认我已经传递了有效的首选项密钥,并且与所述密钥相关联的首选项。

PreferenceCompatFragment#scrollToPreference(String)调用内部函数scrollToPreferenceInternal(String,Preference),该内部函数依次调用PreferenceGroupAdapter#getPreferenceAdapterPosition,该函数查找可见的行,当调用观察者时可能不会创建该行。加载所有首选项后如何滚动?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...