【问题标题】:How to set items in BottomNavigationView selected when swiping fragments in Kotlin在Kotlin中滑动片段时如何设置BottomNavigationView中的项目
【发布时间】:2019-08-05 18:53:06
【问题描述】:

对于一个 android 应用程序,我有一个 BottomNavigationView,其中包含三个项目和相应的片段。使用ViewPager,我可以在这三个片段之间滑动。 (默认选择是我的 navigationItem2。)
我的问题是我的底部导航中的项目仅在单击时被选中,但不要在滑动时更改选择,而片段在滑动时会发生变化。

那么如何实现在滑动时选择项目呢?

我的 MainActivity.kt

class MainActivity : AppCompatActivity() {

private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener {item->
    when(item.itemId){
        R.id.navigationItem1 ->{
            replaceFragment(Fragment1())
            viewPager.currentItem = 0
            return@OnNavigationItemSelectedListener true
        }
        R.id.navigationItem2 ->{
            replaceFragment(Fragment2())
            viewPager.currentItem = 1
            return@OnNavigationItemSelectedListener true
        }
        R.id.navigationItem3 ->{
            replaceFragment(Fragment3())
            viewPager.currentItem = 2
            return@OnNavigationItemSelectedListener true
        } else -> viewPager.currentItem = 1
    }
    false
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val pageAdapter = FragmentPagerAdapter(supportFragmentManager)
    viewPager.adapter = pageAdapter

    bottomNavigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
    bottomNavigation.selectedItemId = R.id.navigationItem2

我的activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:fitsSystemWindows="true"
    android:background="?attr/backgroundcolor"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <FrameLayout
            android:id="@+id/fragmentContainer"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
           app:layout_constraintBottom_toTopOf="@+id/bottomNavigation">
        </FrameLayout>    

    </androidx.viewpager.widget.ViewPager>

    <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottomNavigation"
            app:menu="@menu/bottom_nav_menu"
            android:background="@android:color/white"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintVertical_bias="1.0"
            app:layout_constraintHorizontal_bias="1.0"/>

</androidx.constraintlayout.widget.ConstraintLayout>

我的 FragmentPageAdapter.kt

class FragmentPagerAdapter (fragmentManager: FragmentManager): FragmentPagerAdapter(fragmentManager){

override fun getItem(position: Int): Fragment {
    return when (position){
        0 -> Fragment1.newInstance()
        1 -> Fragment2.newInstance()
        2 -> Fragment3.newInstance()
        else -> Fragment2.newInstance()
    }
}

override fun getCount() = 3
}

【问题讨论】:

    标签: android android-fragments kotlin android-viewpager bottomnavigationview


    【解决方案1】:

    您可以使用 ViewPager 的 addOnPageChangeListener 并在 onPageSelected 函数上设置当前项。

    viewPager!!.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
    
                override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
                    //alerta("menu",position.toString())
                }
    
                override fun onPageSelected(position: Int) {
                        bottomNavigationView!!.getMenu().getItem(position).setChecked(true)
    
                }
    
                override fun onPageScrollStateChanged(state: Int) {
    
                }
            })
    

    【讨论】:

      【解决方案2】:

      BottomNavigationView 不是 TabLayout
      您必须在ViewPager 中实现监听器。

      mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                  public void onPageScrollStateChanged(int state) {
                  }
      
                  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                  }
      
                  public void onPageSelected(int position) {
                      navigation.getMenu().getItem(position).setChecked(true);
                      //Here your code
                  }
              });
      

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 1970-01-01
        • 2017-08-31
        • 1970-01-01
        • 1970-01-01
        • 2017-03-05
        • 2017-11-20
        • 1970-01-01
        相关资源
        最近更新 更多