简体   繁体   English

无法更改 android 工具栏中的 header 和抽屉图标和标题

[英]Unable to change the header and drawer icon and title in toolbar in android

I am trying to change the title and drawer icon of toolbar in navigation of one fragment我正在尝试在一个片段的导航中更改工具栏的标题和抽屉图标

Here is what I am trying to implement:这是我想要实现的:

DrawerItem1 -> HomeFragment -> CategoryFragment -> Frag3 -> Frag4 DrawerItem1 -> HomeFragment -> CategoryFragment -> Frag3 -> Frag4

DrawerItem2 -> FavoriteFragment DrawerItem2 -> FavoriteFragment

DrawerItem3 -> Frag6 DrawerItem3 -> Frag6

DrawerItem4 -> Frag7 DrawerItem4 -> Frag7

So, here when I navigate from HomeFragment to FavoriteFragment the toolbar drawer icon changes to back icon and title changes to 'Favorite' as set in navigation.因此,在这里,当我从HomeFragment导航到FavoriteFragment时,工具栏抽屉图标更改为后退图标,标题更改为导航中设置的“收藏夹”。 But, when I navigate from HomeFragment -> CategoryFragment -> SubCategoryFragment I am unable to change the toolbar drawer icon to back icon and toolbar title to fragment title.但是,当我从HomeFragment -> CategoryFragment -> SubCategoryFragment导航时,我无法将工具栏抽屉图标更改为后退图标,将工具栏标题更改为片段标题。

Here is my implementation so far.到目前为止,这是我的实现。

MainActivity.java MainActivity.java

public class MainActivity extends AppCompatActivity {

private AppBarConfiguration mAppBarConfiguration;
private DrawerLayout drawer;
private NavController navController;
private NavHostFragment navHostFragment;
private NavigationView navigationView;
public static Toolbar toolbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show();
    }
});
drawer = findViewById(R.id.drawer_layout);
navigationView = findViewById(R.id.nav_view);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.

navHostFragment =
        (NavHostFragment) getSupportFragmentManager()
                .findFragmentById(R.id.nav_host_fragment);
navController = navHostFragment.getNavController();
mAppBarConfiguration = new AppBarConfiguration.Builder(
        navController.getGraph())
        .setDrawerLayout(drawer)
        .build();
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main_category, menu);
return true;
}

@Override
public boolean onSupportNavigateUp() {
  return NavigationUI.navigateUp(navController, mAppBarConfiguration);
}

@Override
public void onBackPressed() {

  }
}

HomeFragment.java首页Fragment.java

public class HomeFragment extends Fragment {

private HomeViewModel homeViewModel;
private RecyclerView rv;
private ProgressBar pb;
private DataAdapter adapter;
private List<DataModel> modelList;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_home, container, false);
    rv = v.findViewById(R.id.rv_home);
    pb = v.findViewById(R.id.home_pb);
    return v;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    modelList = new ArrayList<>();
    Log.d("Home Frag", "onViewCreated: called again after back");

    rv.setLayoutManager(new GridLayoutManager(getActivity(), 2));
    rv.setHasFixedSize(true);

    pb.setVisibility(View.VISIBLE);
    homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class);
    homeViewModel.getUserMutableLiveData().observe(getViewLifecycleOwner(),
            userListUpdateObserver);

    pb.setVisibility(View.GONE);

    view.setFocusableInTouchMode(true);
    view.requestFocus();
    view.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            Log.i("HomeFragment", "keyCode: " + keyCode);
            if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
                Log.i("HomeFragment", "keyCode: " + keyCode);
                AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                builder.setTitle("Logout");
                builder.setMessage("Are you sure you want to Logout?");

                // add the buttons
                builder.setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                                getActivity().finish();
                            }
                        });
                builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });

                // create and show the alert dialog
                AlertDialog dialog = builder.create();
                dialog.show();
                return true;
            }
            return false;
        }
    });
}

Observer<List<Category>> userListUpdateObserver = new Observer<List<Category>>() {
    @Override
    public void onChanged(final List<Category> userArrayList) {
        for (int i = 0; i < userArrayList.size(); i++) {
            modelList.add(new DataModel(userArrayList.get(i).getTitle(), userArrayList.get(i).getImage(), userArrayList.get(i).getId(), 0));
        }
        adapter = new DataAdapter(getContext(), modelList, new DataAdapter.RecyclerViewClickListener() {
            @Override
            public void onClick(View view, int position) {
                homeViewModel.selectedId(modelList.get(position).getId());
                homeViewModel.selectedString(modelList.get(position).getText());
                SubCategoryFragment subCategoryFragment = new SubCategoryFragment();
                ManageFragments.replaceFragment((FragmentActivity) getContext(), subCategoryFragment);
            }
        });
        rv.setLayoutManager(new GridLayoutManager(getActivity(), 2));
        rv.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
};
}

mobile_navigation.xml mobile_navigation.xml

?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"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mobile_navigation"
app:startDestination="@+id/nav_home">

<fragment
    android:id="@+id/nav_home"
    android:name="com.drawerapp.fragment.home.HomeFragment"
    android:label="@string/menu_home"
    tools:layout="@layout/fragment_home">
</fragment>

<fragment
    android:id="@+id/nav_sub_category"
    android:name="com.drawerapp.fragment.sub_category.SubCategoryFragment"
    android:label="SubCategoryFragment">

    <action
        android:id="@+id/action_nav_sub_category_to_nav_home"
        app:destination="@id/nav_home"
        app:popExitAnim="@anim/nav_default_pop_exit_anim" />
</fragment>

<fragment
    android:id="@+id/nav_gallery"
    android:name="com.drawerapp.fragment.gallery.GalleryFragment"
    android:label="GalleryFragment">
    <action
        android:id="@+id/action_nav_gallery_to_nav_sub_category"
        app:destination="@id/nav_sub_category"
        app:popExitAnim="@anim/nav_default_pop_exit_anim" />
</fragment>

<fragment
    android:id="@+id/nav_fav"
    android:name="com.drawerapp.fragment.favorites.FavoritesFragment"
    android:label="@string/menu_fav"
    tools:layout="@layout/fragment_favorite">
    <action
        android:id="@+id/action_nav_fav_to_nav_home"
        app:destination="@id/nav_home"
        app:exitAnim="@anim/fragment_fade_exit"
        app:popExitAnim="@anim/nav_default_pop_exit_anim" />
</fragment>

<fragment
    android:id="@+id/nav_feedback"
    android:name="com.drawerapp.fragment.feedback.FeedbackFragment"
    android:label="@string/menu_feedback"
    tools:layout="@layout/fragment_feedback">
    <action
        android:id="@+id/action_nav_feedback_to_nav_fav"
        app:destination="@id/nav_fav"
        app:exitAnim="@anim/fragment_fade_exit"
        app:popExitAnim="@anim/nav_default_pop_exit_anim" />
</fragment>

<fragment
    android:id="@+id/nav_about_us"
    android:name="com.drawerapp.fragment.about_us.AboutUsFragment"
    android:label="@string/menu_about_us"
    tools:layout="@layout/fragment_about_us">
    <action
        android:id="@+id/action_nav_about_us_to_nav_feedback"
        app:destination="@id/nav_feedback"
        app:exitAnim="@anim/fragment_fade_exit"
        app:popExitAnim="@anim/nav_default_pop_exit_anim" />
</fragment>

You're still doing ManageFragments.replaceFragment((FragmentActivity) getContext(), subCategoryFragment);你还在做ManageFragments.replaceFragment((FragmentActivity) getContext(), subCategoryFragment); - you cannot do FragmentTransactions when you're using Navigation. - 使用导航时不能执行 FragmentTransactions。

Replace that code with a call to navigate(R.id.nav_sub_category) to navigate to your SubCategoryFragment .将该代码替换为调用navigate(R.id.nav_sub_category)以导航到您的SubCategoryFragment

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

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