如何单击片段中的按钮以切换到Kotlin中的其他选项卡?

时间:2018-12-08 12:22:48

标签: android kotlin

以下代码基于Android Studio向导3.2.1创建标签式活动。

button1连接的Tab1上有一个PlaceholderFragment1,在button2连接的Tab2上有一个PlaceholderFragment2

我希望单击button1切换到Tab2,然后单击button2切换到Tab1,我该怎么办?

顺便说一句,我已经读过How to change tab on button click in Android?How to programmatically switch tabs using buttonclick in Android

代码

class MainActivity : AppCompatActivity() {

    private var mSectionsPagerAdapter: SectionsPagerAdapter? = null

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

        mSectionsPagerAdapter = SectionsPagerAdapter(supportFragmentManager)


        container.adapter = mSectionsPagerAdapter

        container.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabs))
        tabs.addOnTabSelectedListener(TabLayout.ViewPagerOnTabSelectedListener(container))

    }


    inner class SectionsPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) {

        override fun getItem(position: Int): Fragment {
            val fragment: Fragment
            when (position) {
                0 -> fragment = PlaceholderFragment1()  //Tab1
                1 -> fragment = PlaceholderFragment2()  //Tab2
                else -> throw IllegalArgumentException("Invalid section number")
            }
            return fragment
        }

        override fun getCount(): Int {
            return 2
        }
    }


    class PlaceholderFragment1 : Fragment() {

        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            val rootView = inflater.inflate(R.layout.fragment_main1, container, false)
            return rootView
        }

        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
           button1.setOnClickListener {
               //Switch to Tab2
           }
        }
    }


    class PlaceholderFragment2 : Fragment() {

        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            val rootView = inflater.inflate(R.layout.fragment_main2, container, false)
            return rootView
        }

        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            button2.setOnClickListener {
                //Switch to Tab1
            }
        }
    }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:id="@+id/main_content"
                                                 android:layout_width="match_parent"
                                                 android:layout_height="match_parent"
                                                 android:fitsSystemWindows="true"
                                                 tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingTop="@dimen/appbar_padding_top"
            android:theme="@style/AppTheme.AppBarOverlay">


        <android.support.design.widget.TabLayout
                android:id="@+id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

            <android.support.design.widget.TabItem
                    android:id="@+id/tabItem"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/tab_text_1"/>

            <android.support.design.widget.TabItem
                    android:id="@+id/tabItem2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/tab_text_2"/>

        </android.support.design.widget.TabLayout>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>


</android.support.design.widget.CoordinatorLayout>

fragment_main1.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                             xmlns:app="http://schemas.android.com/apk/res-auto"
                                             xmlns:tools="http://schemas.android.com/tools"
                                             android:id="@+id/constraintLayout"
                                             android:layout_width="match_parent"
                                             android:layout_height="match_parent"
                                            >


    <Button
            android:text="Button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button1"/>
</android.support.constraint.ConstraintLayout>

我的方式

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
       ...

        setControl(view)
}


private fun setControl(view: View){
   button1.setOnClickListener {
             var viewPager=view.parent as ViewPager
             viewPager.setCurrentItem(1,true)
   }
}

2 个答案:

答案 0 :(得分:1)

不需要手动绑定这些事件...

您只需将TabLayout设置为Viewpager

container.adapter = mSectionsPagerAdapter
tabs.setupWithViewPager(container);

然后这些事件由框架以一种相当方便的方式处理。

PS:containerViewPager的一个不幸的变量名。

答案 1 :(得分:1)

我认为您应该使用LivedataViewModel

  • 使用livedata创建View Model类。
  • MainActivity中的观察者实时数据。
  • 从片段更新livedata值。

例如:

class TabChangerViewModel : ViewModel() {
    val colorResource = MutableLiveData<Int>()
    .........
}

在您的MainActivity类中:

val tabChangerViewModel = ViewModelProviders.of(this).get(TabChangerViewModel::class.java) // initialize view model

        tabChangerViewModel.colorResource.observe(this, android.arch.lifecycle.Observer {
        //mViewPager.setCurrentItem(it)
    })

现在从片段中更新实时数据值:

    val tabChangerViewModel = ViewModelProviders.of(activity).get(TabChangerViewModel::class.java) // initialize view model

tabChangerViewModel.colorResource.value = TAB_POSITION_WANT_TO_SELECT