如何在BottonNavigationView中使用onBackPressed?

时间:2017-10-27 01:38:16

标签: java android android-fragments

如何在BottonNavigationView中使用onBackPressed来选择项目?例如,如果我按下第2项,我会转到2号片段,但是当我向后推时,我将返回到片段编号1并且仍然选择第2项,未选择项目1,这是与片段1相对应的片段。

这是我的代码

private BottomNavigationViewEx.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
    = new BottomNavigationView.OnNavigationItemSelectedListener() {

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();


    switch (item.getItemId()) {

        case R.id.mapa:
            transaction.replace(R.id.content, new MapFragment());
            getSupportFragmentManager().popBackStack();
            transaction.commit();

            return true;

        case R.id.taxi:
            transaction.replace(R.id.content, new TaxiFragment());
            transaction.addToBackStack(null);
            getSupportFragmentManager().popBackStack();
            transaction.commit();

            return true;

        case R.id.help:
            transaction.replace(R.id.content, new HelpFragment());
            transaction.addToBackStack(null);
            getSupportFragmentManager().popBackStack();
            transaction.commit();

            return true;

        case R.id.go:
            transaction.replace(R.id.content, new GoFragment());
            transaction.addToBackStack(null);
            getSupportFragmentManager().popBackStack();
            transaction.commit();

            return true;

    }



    return false;
}
};

} 

更新

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mapa);

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.content, new MapFragment()).commit();

    BottomNavigationViewEx bottomNavigationViewEx = (BottomNavigationViewEx) findViewById(R.id.bottomViewBar);
    bottomNavigationViewEx.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);

    BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationViewEx);
    bottomNavigationViewEx.setSelectedItemId(R.id.mapa);

    MenuItem item = bottomNavigationViewEx.getMenu().getItem(0);

    if (!item.isChecked()) item.setChecked(true);



}

private BottomNavigationViewEx.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();


        switch (item.getItemId()) {

            case R.id.mapa:
                transaction.replace(R.id.content, new MapFragment());
                getSupportFragmentManager().popBackStack();
                transaction.commit();

                return true;

            case R.id.taxi:
                transaction.replace(R.id.content, new TaxiFragment());
                transaction.addToBackStack(null);
                getSupportFragmentManager().popBackStack();
                transaction.commit();

                return true;

            case R.id.help:
                transaction.replace(R.id.content, new HelpFragment());
                transaction.addToBackStack(null);
                getSupportFragmentManager().popBackStack();
                transaction.commit();

                return true;

            case R.id.go:
                transaction.replace(R.id.content, new GoFragment());
                transaction.addToBackStack(null);
                getSupportFragmentManager().popBackStack();
                transaction.commit();

                return true;

        }



        return false;
    }
};

@Override
public void onBackPressed () {
    if (mCurrentItem > 0) {
        mCurrentItem--;
        showFragment (mCurrentItem);
    } else {
        super.onBackPressed();
    }
}


private void showFragment(int currentItem) {

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();


    switch (currentItem) {
        case 0:
            transaction.replace(R.id.content, new MapFragment());
            getSupportFragmentManager().popBackStack();
            transaction.commit();

            break;

        case 1:
            transaction.replace(R.id.content, new TaxiFragment());
            getSupportFragmentManager().popBackStack();
            transaction.commit();
            break;

        case 2:
            transaction.replace(R.id.content, new HelpFragment());
            getSupportFragmentManager().popBackStack();
            transaction.commit();
            break;

        case 3:
            transaction.replace(R.id.content, new GoFragment());
            getSupportFragmentManager().popBackStack();
            transaction.commit();
            break;
    }
}



}

我现在有这个,但我不知道是否正确

2 个答案:

答案 0 :(得分:0)

保留一个变量来表示您当前的Fragment。在onBackPressed内,检查当前Fragment的内容,并确定要导航到的位置。

@Override
public void onBackPressed() {            
    if (mCurrentItem > 0) {
        mCurrentItem--;
        showFragment(mCurrentItem);
    } else {
        super.onBackPressed();
    }
}

您的showFragment(mCurrentItem)可以根据值显示不同的页面,或者您希望显示不同的页面。

private void showFragment(int currentItem) {
    switch (currentItem) {
        case 0:
            transaction.replace(R.id.content, new MapFragment());
            getSupportFragmentManager().popBackStack();
            transaction.commit();
            break;

        case 1:
            ...
    }
}

然后在showFragment(currentItem)方法中添加此代码以选择BottomNavigationView上的项目:

MenuItem item = mBottomNavigationView.getMenu().getItem(mCurrentItem);

if (!item.isChecked()) item.setChecked(true);

答案 1 :(得分:0)

通过在onCreateView方法的相应片段的类中添加此行来解决我的问题,因此当按下该项时会被选中。

x