我正在尝试将中型应用程序迁移到新的Android navigation组件。
目前,我的应用程序由组成,single activity并且我打算将其保持不变(就此而言);因此,我面临的问题是我有一个设置片段(PreferenceFragment),基本上可以从其他所有片段中导航到该片段。该导航是通过应用栏中的菜单进行的,因此onOptionsItemSelected(包含此导航)位于主活动中。
我在确定将线连接settingsFragment到其他线的正确方法时遇到了麻烦。对我来说,将它连接到所有其他对象似乎是意大利面条。
应该settingsFragment连接到所有其他片段吗?
由于Google没有给出足够的理由(或任何理由)来支持单一活动的应用程序体系结构,我应该放弃它吗?
我做了一个活动A,里面有一个片段x.通过片段x,编辑单击事件上的文本项,我想打开另一个片段y,其中显示列表,我只需按列表上的名称,y片段关闭并将列表的选定名称发送到片段x编辑文本和我做的代码是
YFragment y = new YFragment();
y.setTargetFragment(x.class, code);
getActivity().getSupportFragmentManager()
.beginTransaction()
.replace(R.id.frame, y)
.addToBackStack(null).commit();
Run Code Online (Sandbox Code Playgroud)
并且在片段yi中,目标代码发送数据,但上面的代码块中存在问题.如果我评论设置目标片段行代码将工作,但没有用,因为数据将不会发送,但如果我运行应用程序此错误发生
java.lang.IllegalStateException:片段y {46d3d31#3 id = 0x7f090069}声明的目标片段x {e2c16#0 id = 0x7f090104 android:switcher:2131296516:0}不属于此FragmentManager!
在以前版本的支持库中,我们可以使用标题来拥有一个设置的主菜单屏幕,每个屏幕都会打开一个新的设置屏幕(片段)。
现在标题消失了(如这里所写)一段时间,我认为在 android-x 上情况变得更糟:
你会注意到这里没有的一件事是首选项标题,你是完全正确的。然而,这并不意味着单个偏好列表需要跨越 10 英寸平板电脑屏幕。相反,您的 Activity 可以实现 OnPreferenceStartFragmentCallback ( link ) 以使用 app:fragment 属性或 OnPreferenceStartScreenCallback ( link ) 处理首选项以处理 PreferenceScreen 首选项。这允许您在一个窗格中构造“标题”样式 PreferenceFragmentCompat 并使用这些回调替换第二个窗格,而无需在两种不同类型的 XML 文件中工作。
问题是,我没有在新的 android-x API 上使用这些。
每个片段都有自己的首选项 XML 树(使用setPreferencesFromResource内onCreatePreferences),但我提出的每个解决方案要么什么都不做,要么崩溃。
以直观的方式来说,这就是我想要实现的目标:
由于有多个子设置屏幕,将所有子设置屏幕的所有首选项都放在主设置屏幕的一个 XML 文件中会非常麻烦。
我唯一成功的是使用 PreferenceScreen 来保存应该显示的子屏幕的首选项。
这是此类事情的工作代码(可在此处获得项目):
首选项.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="Demo">
<PreferenceScreen
android:key="screen_preference" android:summary="Shows another screen of preferences"
android:title="Screen preferenc">
<CheckBoxPreference
android:key="next_screen_checkbox_preference"
android:summary="Preference that is on the next screen but same hierarchy"
android:title="Toggle preference"/> …Run Code Online (Sandbox Code Playgroud) android android-preferences android-fragments preferencefragment androidx