如何通过单击工具栏图标Android导航到片段

时间:2019-12-08 23:59:53

标签: android android-fragments android-architecture-navigation

我的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>

1 个答案:

答案 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用于从当前片段导航到下一个片段