我的AppBar
中有一个ImageButton,现在我想导航到单击时的settings
片段。
我已经为我的Navigation Graph XML specification
片段准备了一个settings
,如下所示:
<fragment
android:id="@+id/settings"
android:name="try.settingsFragment"
android:label="@string/settings_title"
tools:layout="@layout/fragment_settings">
</fragment>
现在我想做的是指定一个OnClickListener
,它可以简单地导航到指定的页面,所以我尝试了:
public class MainActivity extends AppCompatActivity {
@Override
protected void onStart() {
super.onStart();
AppCompatImageButton settingsButton = this.findViewById(R.id.toolbar_settings_button);
settingsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
navigate();
}
});
}
private void navigate() {
Navigation.findNavController(this, R.id.toolbar_settings_button).navigate(R.id.settings);
}
}
结果:
app:id/toolbar_settings_button} does not have a NavController set
那么如何在navigation.xml
中注册不是片段的内容呢?我从未见过其他指定的内容,但应用程序栏根本不是片段。
修改
问题似乎与我的工具栏规范有关-它不在NavHostFragment
之外。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appbar_include"
app:layout_constraintVertical_bias="0.0"
app:navGraph="@navigation/mobile_navigation">
</fragment>
<include
android:id="@+id/appbar_include"
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
应用程序条形码(对我而言有趣的元素是@+id/toolbar_settings_button
):
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginEnd="0dp">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="342dp"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/AppTheme.PopupOverlay">
<SearchView
android:id="@+id/toolbar_search"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:maxWidth="1000000dp" />
</androidx.appcompat.widget.Toolbar>
<androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/toolbar_settings_button"
android:layout_width="60dp"
android:layout_height="match_parent"
android:src="@drawable/ic_settings_icon_foreground"
android:background="@color/colorPrimary"/>
</LinearLayout>
</com.google.android.material.appbar.AppBarLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
答案 0 :(得分:1)
app:id/toolbar_settings_button
没有设置NavController,但是您的nav_host_fragment
有
private void navigate() {
findNavController(R.id.nav_host_fragment).navigate(R.id.action_fragmentA_to_fragmentB);
}
确保正确构建了导航图。 在导航图中,.xml可能类似于:
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/my_test_graph"
app:startDestination="@id/fragmentA">
<fragment
android:id="@+id/fragmentA"
android:name="com.example.ui.fragmentA"
android:label="fragment_a"
tools:layout="@layout/fragment_a" >
<action
android:id="@+id/action_fragmentA_to_fragmentB"
app:destination="@id/fragmentB" />
</fragment>
<fragment
android:id="@+id/fragmentB"
android:name="com.example.ui.fragmentB"
android:label="fragment_b"
tools:layout="@layout/fragment_b" >
</fragment>
</navigation>
fragmentB是您的settingsFragment。
操作ID用于从当前片段导航到下一个片段