[英]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:您当前的片段流:
boot()
-> No fragment attached boot()
-> 没有附加片段onCreate()
-> Add HomeFragment
(nothing in back stack). onCreate()
-> 添加HomeFragment
(后栈中没有任何内容)。onTabClick()
-> Replacing current fragment with CategoryFragment
(nothing in back stack) onTabClick()
-> 用CategoryFragment
替换当前片段(返回堆栈中没有任何内容)openFruitDetails()
-> Replace current fragment with FruitCategory
and adding to back stack current fragment (now CategoryFragment
in back stack) openFruitDetails()
-> 用FruitCategory
替换当前片段并将当前片段添加到后台堆栈(现在是后台堆栈中的CategoryFragment
)onTabClick()
-> Replacing current fragment with ProfileFragment
( CategoryFragment
still in back stack) onTabClick()
-> 用ProfileFragment
替换当前片段( CategoryFragment
仍在后台堆栈中)onBackClick()
-> Pop back CategoryFragment
from back stack. onBackClick()
-> 从返回栈中弹出CategoryFragment
。What you can do with it?你能用它做什么?
jetpack navigation
, cicerone
, modo
etc.好一个 -> 添加导航库jetpack navigation
、 cicerone
、 modo
等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.