加载上一个片段时如何更改底部导航工具栏的图标

时间:2019-05-25 02:25:39

标签: android bottomnavigationview

当我完美地单击bottomNavigationView时,如何使用bottomNavigationView,但是当我按下后退按钮时,片段变成了先前的片段,而private BottomNavigationView.OnNavigationItemSelectedListener navListener = new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { Fragment selectedFragment = null; switch (item.getItemId()) { case R.id.nav_home: selectedFragment = new HomeFragment(); break; case R.id.nav_fav: selectedFragment = new Fragment(); break; case R.id.nav_search: selectedFragment = new SearchFragment(); break; } getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, selectedFragment).addToBackStack(null).commit(); return true; } }; 的图标却没有改变

>car_df

Grade         Speed      Age
  7             54       13
  10            NA       4
  NA            43       23
  3             NA       NA
  1             87       12
  NA            NA       NA

当我单击返回而不是图标时,这是更改片段,请帮助我

4 个答案:

答案 0 :(得分:0)

回去时,尝试做一个 column "column1" is of type json but expression is of type text

performClick()

答案 1 :(得分:0)

我认为您可以这样设置所选项目

BottomNavigationView navView = findViewById(R.id.nav_view);
navView.setSelectedItemId(R.id.navigation_dashboard);

在按下后退按钮的情况下,您应该跟踪我认为用于切换的前一个按钮ID。我认为在viewpager中,有一个自动机制。

答案 2 :(得分:0)

对于具有 BpttomNavigation 和片段的页面,我建议使用 ViewPager

  

ViewPager 的优点:灵活性,可控制性,性能,更清晰的代码以及片段更改和手指滑动时的滑动动画效果很好。

为了获得您想要的结果,您可以使用类似以下的方法:

  • 将您的ViewPager放在BpttomNavigation上方:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    
    <!-- Doesn't need any addition -->
    <android.support.v4.view.ViewPager 
            android:layout_above="@id/bottomNavigation"
            android:layout_width="match_parent"
            android:id="@+id/viewPager"                           
            android:layout_height="match_parent"/>
    
    <!-- Set up menu and stuff -->
    <android.support.design.widget.BottomNavigationView
            android:id="@+id/bottomNavigation"
            android:layout_alignParentBottom="true"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    
    </RelativeLayout>
    
  • 创建您的ViewPagerFragmentAdapter:

    public class ViewPagerFragmentAdapter extends FragmentPagerAdapter {
    
    private ArrayList<Fragment> fragments;
    
    public ViewPagerFragmentAdapter(FragmentManager fragmentManager, ArrayList<Fragment> fragments) { 
        super(fragmentManager);
        this.fragments = fragments;
    }
    
    //Returns fragment by position
    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }
    
    //Returns fragment count
    @Override
    public int getCount() {
        return fragments.size();
    }
    }
    
  • 设置您的视图,片段和适配器:

     @Override
       protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        //Initialize views
        final ViewPager viewPager = findViewById(R.id.viewPager);
        final BottomNavigationView navigationView = findViewById(R.id.bottomNavigation);
    
        //Initialize fragments list
        ArrayList fragmentsArray = new ArrayList<Fragment>();
        fragmentsArray.add(new FirstFragment());
        fragmentsArray.add(new SecondFragment());
        fragmentsArray.add(new ThirdFragment());
    
        //Initialize adapter and attach it to view pager
        ViewPagerFragmentAdapter adapterViewPager = new ViewPagerFragmentAdapter(
                getSupportFragmentManager(),
                fragmentsArray
                );
    
        viewPager.setAdapter(adapterViewPager);
    }
    

您的魔力来了,设置听众

  • ViewPager 页面选择监听器(滑动或其他方式):

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float v, int i1) { }
    
        @Override
        public void onPageSelected(int position) {
            //Here goes the magic
            switch (position) {
                case 0:
                    navigationView.setSelectedItemId(R.id.menu_first_fragment);
                    break;
                case 1:
                    navigationView.setSelectedItemId(R.id.menu_second_fragment);
                    break;
                case 2:
                    navigationView.setSelectedItemId(R.id.menu_third_fragment);
                    break;
                default:
                    //Handle exception
                    break;
            }
        }
        @Override
        public void onPageScrollStateChanged(int position) { }
    });
    
  • BottomNavigation 项目选择侦听器:

    navigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
            switch (menuItem.getItemId()) {
                case R.id.menu_first_fragment:
                    viewPager.setCurrentItem(0);
                    break;
                case R.id.menu_second_fragment:
                    viewPager.setCurrentItem(1);
                    break;
                case R.id.menu_third_fragment:
                    viewPager.setCurrentItem(2);
                    break;
                default: return false;
                    break;
            }
            //I'm not sure if you should return true or false but you can try
            return true;
        }
    
    });
    
  • 最后,要选择最后一个片段 onBackPressed(),应将其保留在变量中,并调用 viewPager.setCurrentItem(lastFragmentPosition); ,监听器将自动触发,并设置 NavigationView 正确的项目,

    • 您可以检查 lastFragmentPostion 是否等于 viewPager.getCurrentItem(); 退出活动或应用程序。

我已经很长时间没有使用Java了,但是我相信这段代码没有任何错误。

  

注意:如果您希望每次使用此方法时都返回一个新的片段实例,则可以直接在适配器中使用 getItem(position)方法初始化片段。调用,在这种情况下,您将不需要构造函数中的 ArrayList ,也不要忘记在 getCount()方法中返回片段的数量

编码愉快!

答案 3 :(得分:0)

我希望您在使用addToBackStack(null)时不要使用BottomNavigationBar,而是返回onBackPressed();上的home片段

为此,您可以使用

FragmentManager manager; Fragment frag = manager.findFragmentById(R.id.your_frame_layout);

并检查instanceof变量中的frag对象

`if (frag instanceof HomeFragment) {
        super.onBackPressed();//Exits the app if home fragment
    } else {
        manager.beginTransaction().replace(R.id.frame_layout, new HomeFragment()).commit();
//returns to home fragment when user presses back button
        navigation.setSelectedItemId(R.id.navigation_home);
    }`