Обработка и отображение значка "Назад" на панели инструментов с нажатым фрагментом

Я использую панель навигации с фрагментами, и на моей домашней странице я перемещаюсь следующим образом ==> maincategory ===> subcategory ===> subcategoryDetail

при переходе от основной категории к подкатегории он отлично заменяет значок гамбургера и показывает значок со стрелкой назад, а обратное нажатие работает отлично

но при переходе от subcategory к subcategoryDetail, когда я нажимаю стрелку назад в subcategoryDetail, обратная пресса работает отлично, но заменяет стрелку назад страница subcategory.java со значком гамбургера, и я не могу вернуться на главную страницу

MainActivity.java

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {


    Toolbar toolbar;
    DrawerLayout drawer;
    ActionBarDrawerToggle toggle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        displaySelectedScreen(R.id.nav_home);

    }


    public ActionBarDrawerToggle getToggle() {
        return toggle;
    }


    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            int fragments = getSupportFragmentManager().getBackStackEntryCount();
            if (fragments == 1) {
                finish();
            } else if (getFragmentManager().getBackStackEntryCount() > 1) {
                getFragmentManager().popBackStack();

            } else {
                super.onBackPressed();
                toggle.setDrawerIndicatorEnabled(true);
            }
        }
    }


    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        displaySelectedScreen(item.getItemId());

        return true;
    }

    private void displaySelectedScreen(int itemId) {
        Bundle bundle = new Bundle();
        //creating fragment object

        Fragment fragment = null;
        //initializing the fragment object which is selected
        switch (itemId) {
            case R.id.nav_home:
                fragment = new HomeFragment();
                break;
            case R.id.nav_mens_clothing:
                bundle.putString("MAINCATEGORYID", String.valueOf(1));
                bundle.putString("MAINCATEGORYNAME","Carpentry");
                fragment = new SubCategoryFragment();
                fragment.setArguments(bundle);
                break;
            case R.id.nav_womens_clothing:
                bundle.putString("MAINCATEGORYID", String.valueOf(2));
                bundle.putString("MAINCATEGORYNAME","Electrical");
                fragment = new SubCategoryFragment();
                fragment.setArguments(bundle);
                break;
            case R.id.nav_boys_clothing:
                fragment = new SubCategoryFragment();
                break;
        }

        //replacing the fragment
        if (fragment != null) {
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.content_frame, fragment);
            ft.addToBackStack(null);
            ft.commit();
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
    }

}

SubCategoryFragment.java

public class SubCategoryFragment extends Fragment {
    protected Toolbar toolbar;
    protected ActionBarDrawerToggle toggle;

    View view;

    public SubCategoryFragment() {
        // Required empty public constructor
    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (view == null) {
            view = inflater.inflate(R.layout.fragment_sub_category, container, false);
            toolbar = ((MainActivity) getActivity()).findViewById(R.id.toolbar);
            toggle = ((MainActivity) getActivity()).getToggle();
            shimmerContainer = view.findViewById(R.id.shimmer_view_container);
            recyclerView_subcategory = view.findViewById(R.id.recycler_view_category);

            toggle.setDrawerIndicatorEnabled(false);
            toggle.setHomeAsUpIndicator(R.drawable.back);
            toggle.setToolbarNavigationClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    getActivity().onBackPressed();
                }
            });



        }
        return view;
    }

    @Override
    public void onPause() {
        super.onPause();
        toolbar.setTitle("Cooper");
        toggle.setDrawerIndicatorEnabled(true);

    }

SubCategoryDetailFragment.java

public class SubCategoryDetailFragment extends Fragment {
    protected Toolbar toolbar;
    protected ActionBarDrawerToggle toggle;
    View view;

    public SubCategoryDetailFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (view == null) {
            view = inflater.inflate(R.layout.fragment_sub_category_detail, container, false);
            toolbar = ((MainActivity) getActivity()).findViewById(R.id.toolbar);
            toggle = ((MainActivity) getActivity()).getToggle();

            toggle.setDrawerIndicatorEnabled(false);
            toggle.setHomeAsUpIndicator(R.drawable.back);
            toggle.setToolbarNavigationClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    getActivity().onBackPressed();
                }
            });

        }
        return view;
    }

    @Override
    public void onPause() {
        super.onPause();
        toolbar.setTitle("zzz");
        toggle.setDrawerIndicatorEnabled(true);

    }}
}

person Abhishek Kumar    schedule 03.05.2019    source источник


Ответы (2)


Создайте две разные панели инструментов в XML и настройте их видимость в соответствии с фрагментом и действием. При загрузке действия установите панель инструментов с ящиком навигации, но при фрагментации загрузки в этом действии скройте текущую панель инструментов и замените XML другой панелью инструментов с помощью значка назад.

Не забудьте добавить код панели инструментов в метод onResume () фрагмента.

person Venky    schedule 03.05.2019
comment
но я хочу показать то же меню, что и на моей первой панели инструментов ... если я создам вторую панель инструментов, то снова мне придется написать код для моей второй панели инструментов - person Abhishek Kumar; 03.05.2019

Пожалуйста, добавьте эти две строки в предположение, что все будет работать.

 toggle.setDrawerIndicatorEnabled(false);
 toggle.setHomeAsUpIndicator(R.drawable.back);
person Developer    schedule 03.05.2019