我只有一个活动,它有底部导航
有三个主要的底部片段:主页、列表和指南
在主片段中,有一个导航到新片段的按钮(在与底部导航相同的主片段中)
导航现在工作得很好,但当我按回时,应用程序会接近但不会导航到主Home片段。
这主要是由于对底部导航的处理
这是从Home到下一个片段的片段导航
首页_片段.Java
MaterialButton nextBtn = view.findViewById(R.id.nextBtn);
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Fragment fragment = new FinalHome_Fragment();
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.addToBackStack(String.valueOf(Home_Fragment.class));
fragmentTransaction.commit();
}
});
主要活动.java
//在这里处理底部导航 * 请注意,fragmentmanager和底部导航actovuty是主活动中的全部内容
public BottomNavigationView bottomNavigationView;
Deque<Integer> integerDeque = new ArrayDeque<>(2);
boolean flag = true;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Window window = this.getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.setStatusBarColor(this.getResources().getColor(R.color.black));
}
bottomNavigationView = findViewById(R.id.bottomNavigationView);
bottomNavigationView.setItemIconTintList(null);
integerDeque.push(R.id.home_icon);
loadFragments(new Home_Fragment());
bottomNavigationView.setSelectedItemId(R.id.home_icon);
bottomNavigationView.setOnNavigationItemSelectedListener(
item -> {
int id = item.getItemId();
if (integerDeque.contains(id)) {
if (id == R.id.home_icon) {
integerDeque.size();
if (flag) {
integerDeque.addFirst(R.id.home_icon);
flag = false;
}
}
integerDeque.remove(id);
}
integerDeque.push(id);
loadFragments(getFragment(item.getItemId()));
return true;
}
);
}
@SuppressLint("NonConstantResourceId")
private Fragment getFragment(int itemId) {
switch (itemId) {
case R.id.home_icon:
bottomNavigationView.getMenu().getItem(0).setChecked(true);
return new Home_Fragment();
case R.id.list_icon:
bottomNavigationView.getMenu().getItem(1).setChecked(true);
return new List_Fragment();
case R.id.guide_icon:
bottomNavigationView.getMenu().getItem(2).setChecked(true);
return new Guide_Fragment();
}
bottomNavigationView.getMenu().getItem(0).setChecked(true);
return new Home_Fragment();
}
public void loadFragments(Fragment fragment) {
if (fragment != null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, fragment, fragment.getClass().getSimpleName())
.commit();
}
}
@Override
public void onBackPressed() {
integerDeque.pop();
if (!integerDeque.isEmpty()) {
bottomNavigationView.setSelectedItemId(integerDeque.peek());
} else {
finish();
}
}
3条答案
按热度按时间gwbalxhn1#
如果你需要更容易控制backstack,你可以使用导航片段
https://developer.android.com/guide/navigation/navigation-getting-started
并且您应该显示一条错误消息,以便更容易解决
disbfnqx2#
您应该在这行程式码中设定中断点:
并检查integerDeque中的值。
此外,您应该阅读有关命名约定的内容,将布尔值命名为“标志”确实是个坏主意:)
qgelzfjb3#
您确定您正在填充队列吗?您正确地覆盖了
在按下后()
但看起来它每次都在其他地方