Как нажать кнопку во фрагменте, чтобы переключиться на другую вкладку в Kotlin? - PullRequest
0 голосов
/ 08 декабря 2018

Следующий код основан на Android Studio Wizard 3.2.1 для создания действий с вкладками.

Существует button1 на PlaceholderFragment1 подключенном Tab1 и button2 на PlaceholderFragment2 подключенном Tab2

Я надеюсь нажать кнопку 1, чтобы переключиться на вкладку Tab2, и нажать кнопку button2, чтобы переключиться на вкладку Tab1, как это сделать?

Кстати, я прочитал Как изменить вкладку при нажатии кнопкив Android? и Как программно переключать вкладки с помощью нажатия кнопки в 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>

frag_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 голосов
/ 09 декабря 2018

Я думаю, вам следует использовать Livedata и ViewModel.

  • Создать класс представления модели с жилыми данными.
  • Livedata наблюдателя в MainActivity.
  • ОбновлениеЗначение liveata из вашего фрагмента.

Например:

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
0 голосов
/ 08 декабря 2018

привязка этих событий вручную не требуется ...

вам просто нужно установить TabLayout с Viewpager:

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

, тогда эти события обрабатываютсякаркас, довольно удобным способом.

PS: container - довольно неудачное имя переменной для ViewPager.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...