使用导航组件导航到首选项片段

San*_* Mo 11 android android-jetpack android-architecture-navigation

我正在尝试将中型应用程序迁移到新的Android navigation组件。

目前,我的应用程序由组成,single activity并且我打算将其保持不变(就此而言);因此,我面临的问题是我有一个设置片段(PreferenceFragment),基本上可以从其他所有片段中导航到该片段。该导航是通过应用栏中的菜单进行的,因此onOptionsItemSelected(包含此导航)位于主活动中。

导航图

我在确定将线连接settingsFragment到其他线的正确方法时遇到了麻烦。对我来说,将它连接到所有其他对象似乎是意大利面条。

  1. 应该settingsFragment连接到所有其他片段吗?

  2. 由于Google没有给出足够的理由(或任何理由)来支持单一活动的应用程序体系结构,我应该放弃它吗?

Ale*_*nko 11

要解决您的问题,您可以使用global actions。要使用它们,您需要在<navigation>标记内部定义操作,而不是<fragment>像通常那样在内部定义操作。您的导航图将包含下一个代码

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <!--Your other fragments-->


    <!--Settings fragment-->
    <fragment
        android:id="@+id/settingsFragment"
        android:name="com.example.oleksii.stackoverflow.SettingsFragment"/>

    <!--Global action-->
    <action android:id="@+id/open_settings_fragment"
        app:destination="@id/settingsFragment"/>
</navigation>
Run Code Online (Sandbox Code Playgroud)

在图形编辑器中,它将以另一种方式显示(仅在左侧的箭头destination):

在此处输入图片说明

更多详细信息:https : //developer.android.com/topic/libraries/architecture/navigation/navigation-global-action


Pat*_*tic 6

我可以使用以下方法导航到另一个片段或首选项片段:

全局设置片段:

<PreferenceCategory
    app:title="@string/global_settings_header">
    <Preference
        app:key="fragment_a"
        app:title="A"
        app:fragment="....settings.SettingsFragmentA" />
    <Preference
        app:key="fragment_b"
        app:title="B"
        app:fragment=".....settings.SettingsFragmentB" />
</PreferenceCategory>
Run Code Online (Sandbox Code Playgroud)

在活动中落实PreferenceFragmentCompat.OnPreferenceStartFragmentCallback

public class MainActivity extends AppCompatActivity implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
....

@Override
public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) {
    NavController navController = Navigation.findNavController(MainActivity.this, R.id.nav_host_fragment);
    if (pref.getKey().equals("fragment_a")) {
        navController.navigate(R.id.nav_settings_fragment_a);
    } else if (pref.getKey().equals("fragment_b")) {
        navController.navigate(R.id.nav_settings_fragment_b);
    }
    return true;
}

....
}
Run Code Online (Sandbox Code Playgroud)

我还可以使用 NavController 导航到导航图中定义的任何片段。

任何片段都可以在 中使用app:fragment=".....settings.SettingsFragment"。这个想法是触发回调onPreferenceStartFragment


Sim*_*yon 5

但是如果您的偏好是分层的,那么Fragment <insert fragment name here> declared target fragment <guid> that does not belong to this FragmentManager!当您单击子偏好时就会得到。

我还没有找到解决方案。