繁体   English   中英

想要在工具栏项目上进行片段过渡点击

[英]Want to make a fragment transition on an toolbar item click

当用户单击工具栏上的设置按钮时,我想转换到设置片段,但是我一直在尝试从 onOptionsItemSelected() 进行片段转换,但我无法做到。 我也是导航 controller,但我找不到从 onOptionsSelected() 访问它以进行转换的方法,我将其用于所有其他片段转换。

你能告诉我我做错了什么吗?

谢谢

public class MainActivity extends AppCompatActivity {

    BottomNavigationView bottomNavigationView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        setUpNavigation();
    }


    //bottom bar navigation set up
    public void setUpNavigation(){
        bottomNavigationView = findViewById(R.id.bottom_navigation);
        NavHostFragment navHostFragment = (NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
        NavigationUI.setupWithNavController(bottomNavigationView, navHostFragment.getNavController());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.toolbar_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){

            case R.id.nav_settings:
                Toast.makeText(getApplicationContext(), "Settings Selected", Toast.LENGTH_SHORT).show();
                Log.d("debug","fragment: action settings was clicked");

                getSupportFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, new SettingsFragment()).addToBackStack(null).commit();

                return true;
        }
        return super.onOptionsItemSelected(item);
    }

}

如果您使用的是Android Jetpack 的导航组件,则不应使用 FragmentMangaer 导航到片段。

找到navController如下-

//taking as a global variable here
NavController navController;

public void setUpNavigation(){
    //find NavController
    navController = Navigation.findNavController(this, R.id.nav_host_fragment);

    //setting up Toolbar with NavController
    AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
    NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
    
    //setting up bottomNavigationView
    bottomNavigationView = findViewById(R.id.bottom_navigation);
    NavigationUI.setupWithNavController(bottomNavigationView, navController);
}

如果您在查找 navController 时注意到R.id.nav_host_fragment ,它将与activity_main.xml下的主机片段的 id 相同,如下所示 -

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="?attr/actionBarSize"
        app:defaultNavHost="true"
        app:navGraph="@navigation/mobile_navigation" />


    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:layout_gravity="bottom"
        android:id="@+id/nav_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?android:attr/windowBackground"
        app:menu="@menu/bottom_nav_menu" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

要将目标工具栏菜单项绑定到目标,您只需将与片段相同的 id 放入 navGraph

工具栏_菜单.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    ...

    <item
        android:id="@+id/setting_fragment"
        android:icon="@drawable/ic_details"
        android:title="@string/details" />
</menu>

mobile_navigation.xml (navGraph)

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

    <fragment android:id="@+id/setting_fragment"
         android:label="@string/setting"
         android:name="com.example.android.myapp.SettingFragment" />
</navigation>

请注意,我们将 id setting_fragment赋予菜单项并在 navGraph 中设置片段。

那么您可以按如下方式覆盖onOptionsItemSelected -

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    return NavigationUI.onNavDestinationSelected(item, navController)
            || super.onOptionsItemSelected(item);
}

如果您不使用样式作为 NoActionBar,则无需在活动onCreate()中创建工具栏,因为 android 将为您创建工具栏-

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //no need to create a toolbar if style is not NoActionBar
        //Toolbar toolbar = findViewById(R.id.toolbar);
        //setSupportActionBar(toolbar);

        setUpNavigation();
    }

有关更多信息,请关注使用 NavigationUI 更新 UI 组件

快乐编码!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM