简体   繁体   English

如何处理底部导航栏的碎片?

[英]How to handle bottom navigation bar's fragments?

I have four fragments attached in my bottom nav bar.我在底部导航栏中附加了四个片段。 Now I am trying to go from one this fragments to any other fragment by clicking on a cardview.现在我试图通过单击卡片视图从一个片段转到任何其他片段。 This is working perfectly but when I am going to that fragment to any other fragment(which are attached in nav bar) and pressing back button something weird overlapping is happened.这工作得很好,但是当我将该片段转到任何其他片段(附加在导航栏中)并按下后退按钮时,发生了一些奇怪的重叠。 Here is my nav bar and fragment container activity:这是我的导航栏和片段容器活动:
ShowFragment.java ShowFragment.java

package com.fahim69.bazaarapp.FragmentHolder;
public class ShowFragment extends AppCompatActivity {
BottomNavigationView bottomnav;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_show_fragment);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN);
    bottomnav = findViewById(R.id.nav_bar);
    replacefragment(new HomeFragment());
    bottomnav.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            Fragment fragment = null;
            switch (item.getItemId()) {
                case R.id.nav_home:
                    replacefragment(new HomeFragment());
                    break;
                case R.id.nav_category:
                    replacefragment(new CategoryFragment());
                    break;
                case R.id.nav_cart:
                    replacefragment(new CartFragment());
                    break;
                case R.id.nav_profile:
                    replacefragment(new ProfileFragment());
                    break;
            }

            return true;
        }
    });
}

private void replacefragment(Fragment fragment) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.fragment_container, fragment);
    //fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

} }
And here is my that fragment code from where I am going to different fragment which is not attached to nav bar.这是我的那个片段代码,我将从那里转到未附加到导航栏的不同片段。

package com.fahim69.bazaarapp.Fragment;

public class CategoryFragment extends Fragment {

CardView fruit, fish, meat, vegetable, cooking, dairy, frozen, snacks, bread, beverage, 
personal_care, hygiene, baby_care, homekitchen, petcare;
ImageView fruit_img, fish_img, meat_img, vegetable_img, cooking_img, dairy_img, frozen_img, 
snacks_img, bread_img, beverage_img, personal_img, hygiene_img, baby_img, home_img, pet_img;
TextView fruit_tv, fish_tv, meat_tv, vegetable_tv, cooking_tv, dairy_tv, frozen_tv, snacks_tv, 
bread_tv, beverage_tv, personal_tv, hygiene_tv, baby_tv, home_tv, pet_tv;


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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_category, container, false);
    fruit = view.findViewById(R.id.fruitname);
    fish = view.findViewById(R.id.Fish);
    meat = view.findViewById(R.id.meat);
    vegetable = view.findViewById(R.id.vegetable);
    cooking = view.findViewById(R.id.cooking);
    dairy = view.findViewById(R.id.dairy);
    frozen = view.findViewById(R.id.frozenAndCanned);
    snacks = view.findViewById(R.id.Snacks);
    bread = view.findViewById(R.id.breadandbakery);
    beverage = view.findViewById(R.id.beverages);
    personal_care = view.findViewById(R.id.Personalcare);
    hygiene = view.findViewById(R.id.Hygiene);
    baby_care = view.findViewById(R.id.BabyCare);
    homekitchen = view.findViewById(R.id.HomeandKitchen);
    petcare = view.findViewById(R.id.Petcare);


    fruit_img = view.findViewById(R.id.fruitpic);
    fish_img = view.findViewById(R.id.fish_category_img);
    meat_img = view.findViewById(R.id.meatpic);
    vegetable_img = view.findViewById(R.id.vegetablepic);
    cooking_img = view.findViewById(R.id.cookingpic);
    dairy_img = view.findViewById(R.id.dairypic);
    frozen_img = view.findViewById(R.id.frozenandcannedimg);
    snacks_img = view.findViewById(R.id.snackscatimg);
    bread_img = view.findViewById(R.id.breadandbakeryimg);
    beverage_img = view.findViewById(R.id.beveragesimg);
    personal_img = view.findViewById(R.id.personalcare_img);
    hygiene_img = view.findViewById(R.id.hygiene_img);
    baby_img = view.findViewById(R.id.babycare_img);
    home_img = view.findViewById(R.id.homeandkitchen_img);
    pet_img = view.findViewById(R.id.petcareimg);


    fruit_tv = view.findViewById(R.id.fruit_name_tv);
    fish_tv = view.findViewById(R.id.fish_category_tv);
    meat_tv = view.findViewById(R.id.meat_cat_tv);
    vegetable_tv = view.findViewById(R.id.vegetable_cat_tv);
    cooking_tv = view.findViewById(R.id.cooking_cat_tv);
    dairy_tv = view.findViewById(R.id.dairy_cat_tv);
    frozen_tv = view.findViewById(R.id.frozen_cat_tv);
    snacks_tv = view.findViewById(R.id.snacks_tv);
    bread_tv = view.findViewById(R.id.breadbackery_tv);
    beverage_tv = view.findViewById(R.id.Beverage_tv);
    personal_tv = view.findViewById(R.id.personal_care_tv);
    hygiene_tv = view.findViewById(R.id.hygiene_tv);
    baby_tv = view.findViewById(R.id.babycare_tv);
    home_tv = view.findViewById(R.id.homeandkitchen_tv);
    pet_tv = view.findViewById(R.id.petcare_tv);
    BottomNavigationView item = getActivity().findViewById(R.id.nav_bar);



    fruit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Fragment fragment = new FruitCategory();
            FragmentManager manager = getActivity().getSupportFragmentManager();
            FragmentTransaction transaction = manager.beginTransaction();
            transaction.replace(R.id.fragment_container, fragment);
            transaction.addToBackStack(null);
            transaction.commit();

        }
    });

    return view;
}

} }
从这个片段我要去另一个片段


和目的地片段图片


现在我将使用导航栏从目标片段转到这个片段


并且在按下后退按钮后会发生这种重叠


I tried a lot of stuff but problem is solving.我尝试了很多东西,但问题正在解决。 Help me out.帮帮我。

It's happening because you don't properly work with your back stack.发生这种情况是因为您没有正确使用后堆栈。

Your current fragment flow:您当前的片段流:

  1. boot() -> No fragment attached boot() -> 没有附加片段
  2. onCreate() -> Add HomeFragment (nothing in back stack). onCreate() -> 添加HomeFragment (后栈中没有任何内容)。
  3. onTabClick() -> Replacing current fragment with CategoryFragment (nothing in back stack) onTabClick() -> 用CategoryFragment替换当前片段(返回堆栈中没有任何内容)
  4. openFruitDetails() -> Replace current fragment with FruitCategory and adding to back stack current fragment (now CategoryFragment in back stack) openFruitDetails() -> 用FruitCategory替换当前片段并将当前片段添加到后台堆栈(现在是后台堆栈中的CategoryFragment
  5. onTabClick() -> Replacing current fragment with ProfileFragment ( CategoryFragment still in back stack) onTabClick() -> 用ProfileFragment替换当前片段( CategoryFragment仍在后台堆栈中)
  6. onBackClick() -> Pop back CategoryFragment from back stack. onBackClick() -> 从返回栈中弹出CategoryFragment

What you can do with it?你能用它做什么?

  1. Bad one -> Don't add to back stack any of your fragments.不好的一个-> 不要将任何片段添加到回栈中。
  2. Good one -> Add navigation library jetpack navigation , cicerone , modo etc.好一个 -> 添加导航库jetpack navigationciceronemodo等。
  3. Hard one -> Create your own fragment manager wrapper implementation for resolving such behavior.难点 -> 创建您自己的片段管理器包装器实现来解决此类行为。

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

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