android-fragments 如何在单击按钮时为同一Activity中的片段使用addToBackStack

2q5ifsrm  于 2022-11-13  发布在  Android
关注(0)|答案(3)|浏览(183)

我只有一个活动,它有底部导航
有三个主要的底部片段:主页、列表和指南
在主片段中,有一个导航到新片段的按钮(在与底部导航相同的主片段中)
导航现在工作得很好,但当我按回时,应用程序会接近但不会导航到主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();
        }
    }
gwbalxhn

gwbalxhn1#

如果你需要更容易控制backstack,你可以使用导航片段
https://developer.android.com/guide/navigation/navigation-getting-started
并且您应该显示一条错误消息,以便更容易解决

disbfnqx

disbfnqx2#

您应该在这行程式码中设定中断点:

if (!integerDeque.isEmpty()) {

并检查integerDeque中的值。
此外,您应该阅读有关命名约定的内容,将布尔值命名为“标志”确实是个坏主意:)

qgelzfjb

qgelzfjb3#

您确定您正在填充队列吗?您正确地覆盖了
在按下后()
但看起来它每次都在其他地方

相关问题