BackStack 未导航到正确的 Fragment

您好,我正在尝试使用 addToBaackStack 在某些片段之间导航,但遇到了问题, 好的,我会详细解释,以免混淆

1 :- 我只有一个活动(主活动),它由所有其他片段和一个用于保存片段的片段容器组成,我在主活动中实现了底部导航,底部导航有 5 个主要片段主页、关注、上传、通知和个人资料我的问题与个人资料片段有关

2 :- 在个人资料片段中,我有一些按钮,例如编辑个人资料按钮,它可以打开编辑个人资料片段,但是现在当我按回时,它应该导航回它没有执行的个人资料片段,它正在导航到底部导航的最后一个片段(可以是任何其他主要片段,例如,如果我的最后一个片段是跟随片段,那么当我从编辑配置文件片段返回时,它会转到以下片段)但这不会发生如果我在编辑配置文件片段中放置一个后退箭头图标,那么当我单击后退箭头时,它会完美地将我导航到配置文件片段,因为它与 addToBackStack 无关

它表明问题与我的底部导航有关,但我不知道如何准确修复它

Prifile_Fragment.java

editProfileButton.setOnClicklistener(v -> {
            Fragment edit_profile = new Edit_Profile();
            assert getFragmentManager() != null;
            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.replace(R.id.fragment_container,edit_profile);
            transaction.addToBackStack(null);
            transaction.commit();
        });

Mainactivity.java // 底部导航实现的地方

public class Mainactivity extends AppCompatactivity {

    public BottomNavigationView bottomNavigationView;
    Deque<Integer> integerDeque = new ArrayDeque<>(4);
    boolean flag = true;

    @RequiresApi(api = Build.VERSION_CODES.LOLlipoP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        appcompatdelegate.setDefaultNightMode(appcompatdelegate.MODE_NIGHT_NO);
        setContentView(R.layout.activity_main);
        Window window = this.getWindow();
        window.setStatusBarColor(this.getResources().getcolor(R.color.black));
        bottomNavigationView = findViewById(R.id.bottom_navigation_view);
        integerDeque.push(R.id.nav_home);
        loadFragments(new Home_Fragment());
        bottomNavigationView.setSelectedItemId(R.id.nav_home);

        bottomNavigationView.setOnNavigationItemSelectedListener(
                item -> {
                    int id = item.getItemId();
                    if (integerDeque.contains(id)) {
                        if (id == R.id.nav_home) {
                            integerDeque.size();
                            if (flag) {
                                integerDeque.addFirst(R.id.nav_home);
                                flag = false;
                            }
                        }
                        integerDeque.remove(id);
                    }
                    integerDeque.push(id);
                    loadFragments(getFragment(item.getItemId()));
                    return false;
                }
        );

    }

    @SuppressLint("NonConstantResourceId")
    private Fragment getFragment(int itemId) {
        switch (itemId) {
            case R.id.nav_home:
                bottomNavigationView.getMenu().getItem(0).setChecked(true);
                return new Home_Fragment();
            case R.id.nav_following:
                bottomNavigationView.getMenu().getItem(1).setChecked(true);
                return new Following_Fragment();
            case R.id.nav_upload:
                bottomNavigationView.getMenu().getItem(2).setChecked(true);
                return new Upload_Fragment();
            case R.id.nav_notification:
                bottomNavigationView.getMenu().getItem(3).setChecked(true);
                return new Notification_Fragment();
            case R.id.nav_profile:
                bottomNavigationView.getMenu().getItem(4).setChecked(true);
                return new Profile_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()) {
            loadFragments(getFragment(integerDeque.peek()));
        } else {
            finish();
        }
    }
}
nanersan 回答:BackStack 未导航到正确的 Fragment

您考虑过使用 popBackStack 吗?你可以试试这个。

@Override
public void onBackPressed() {
    final FragmentManager fragmentManager = getSupportFragmentManager();
    if (fragmentManager.getBackStackEntryCount() > 0) {
        fragmentManager.popBackStack();
    } else {
        finish();
    }
}
本文链接:https://www.f2er.com/56008.html

大家都在问