San*_* Mo 11 android android-jetpack android-architecture-navigation
我正在尝试将中型应用程序迁移到新的Android navigation组件。
目前,我的应用程序由组成,single activity并且我打算将其保持不变(就此而言);因此,我面临的问题是我有一个设置片段(PreferenceFragment),基本上可以从其他所有片段中导航到该片段。该导航是通过应用栏中的菜单进行的,因此onOptionsItemSelected(包含此导航)位于主活动中。
我在确定将线连接settingsFragment到其他线的正确方法时遇到了麻烦。对我来说,将它连接到所有其他对象似乎是意大利面条。
应该settingsFragment连接到所有其他片段吗?
由于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
我可以使用以下方法导航到另一个片段或首选项片段:
全局设置片段:
<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。
但是如果您的偏好是分层的,那么Fragment <insert fragment name here> declared target fragment <guid> that does not belong to this FragmentManager!当您单击子偏好时就会得到。
我还没有找到解决方案。
| 归档时间: |
|
| 查看次数: |
1577 次 |
| 最近记录: |