Java Android设置片段拆分为多个屏幕?

Java Android设置片段拆分为多个屏幕?,java,android,kotlin,android-preferences,android-settings,Java,Android,Kotlin,Android Preferences,Android Settings,我正试图在android上实现多屏幕性能,设置片段如图所示 根据文档,我做了另一个设置片段 <Preference app:fragment="com.example.SyncFragment" .../> 单击首选项会引发异常 java.lang.IllegalStateException: Fragment SyncFragment{1bba416} (d133acbc-217d-4af9-a89b-c045c14ee9f6) id=

我正试图在android上实现多屏幕性能,设置片段如图所示

根据文档,我做了另一个设置片段

<Preference
        app:fragment="com.example.SyncFragment"
        .../>
单击首选项会引发异常

  java.lang.IllegalStateException: Fragment SyncFragment{1bba416}
   (d133acbc-217d-4af9-a89b-c045c14ee9f6) id=0x7f0a00de} declared target fragment 
   SettingsFragment{3152a6} (39fdd40c-1430-4b0c-a3b4-0229f3dab696) id=0x7f0a00de}
   that does not belong to this FragmentManager!
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1148)
        at androidx.fragment.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1255)
        at androidx.fragment.app.FragmentTransition.calculateFragments(FragmentTransition.java:1138)
        at androidx.fragment.app.FragmentTransition.startTransitions(FragmentTransition.java:136)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1989)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
        at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6680)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

我也在寻找这个,我最终根据这些答案和答案找到了一些东西。(这是kotlin中的代码,但是Java中的代码非常类似。)

扩展上述示例,我有以下类文件:

  • SettingsActivity.kt
  • 设置碎片.kt
  • MessageSettingsFragment.kt
  • SyncSettingsFragment.kt
和xml定义:

  • root_preferences.xml
  • message_preferences.xml
  • sync_preferences.xml
我将每个子页面添加到preferenceManager:

//SettingsFragment.kt

override fun onCreatePreferences(...) {
    val preference = preferenceManager.findPreference<Preference>("messages")
    preference?.fragment = MessageSettingsFragment.javaclass.name.removeSuffix("\$Companion")
}
此时,主页首选项将自动链接到其子页面。要指定其他行为,您需要在setingsactivity.kt中实现
OnPreferenceStartFragmentCallback
,如上所述


旁注:在示例中,MessageSettingsFragment.kt和SyncSettingsFragment.kt是设置片段(扩展
PreferenceFragmentCompat
),但如果它们是普通片段(扩展
Fragment
),这仍然可以正常工作相反。

您是否记得在您的包含活动中实现
PreferenceFragmentCompat.OnPreferenceStartFragmentCallback
,并从那里打开SyncFragment?@Tenfour04我使用的是一个片段,所以我必须用容器来膨胀布局以替换所选片段吗?文档中有一个示例。和往常一样,实例化一个片段并启动一个事务。但我注意到它说有一个默认的实现,不推荐,但这意味着你实际上不需要这个回调。我从来没有那样做过。我按照Google示例中的要求实现了回调。每当我更改片段时,我的活动就会崩溃。然后我删除了这个函数,问题就消失了。也许默认的实现是好的,谷歌的Android文档,特别是这个例子,是胡说八道。
//SettingsFragment.kt

override fun onCreatePreferences(...) {
    val preference = preferenceManager.findPreference<Preference>("messages")
    preference?.fragment = MessageSettingsFragment.javaclass.name.removeSuffix("\$Companion")
}
//MessageSettingsFragment.kt

class MessageSettingsFragment: Fragment() {

    override fun onCreateView(...): View? {...}

    companion object {
        fun newInstance() = MessageSettingsFragment()
    }
}