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

Есть много ответов на этот вопрос на языке Java, но я не могу его применить используя Kotlin.

Я использую ViewPager для переключения между вкладками и хочу, чтобы заголовок MainActivity менялся каждый раз, когда я проводил пальцем.

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

        setSupportActionBar(toolbar)

        container.adapter = TabPagerAdapter(supportFragmentManager)    
        container.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabs))
    tabs.addOnTabSelectedListener(TabLayout.ViewPagerOnTabSelectedListener(container))
    }

    override fun setTitle(title: CharSequence?) {
        supportActionBar?.title = title
    }
}

Я использую "kotlin-android-extensions", поэтому контейнер - это идентификатор ViewPager, а tabs - это идентификатор TabLayout. Я также создал класс TabPagerAdapter, который расширяет FragmentPagerAdapter. Он возвращает правильную вкладку, которая является производной от фрагмента, с методом getItem. Я попытался достичь своей цели, переопределив метод getPageTitle, но он не работает.

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

    override fun getItem(p0: Int): Fragment {
        return when (p0) {
            else -> TestTab.newInstance()
            }
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return "test title"
    }

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

Пример моей вкладки:

class NotificationsTab : Fragment() {
    private val _title = "Notifications"

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

    companion object {
        fun newInstance(): NotificationsTab {
            return NotificationsTab()
        }
    }
}

Я хочу, чтобы переменная _title была MainActivity title.
XML-файлы, которые я использую:
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        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/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:context="com.androidtest.activities.MainActivity"
        android:orientation="vertical">

    <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="63"
            app:elevation="0dp">

        <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="50"
                android:background="#ffffff"
                app:layout_scrollFlags="scroll|enterAlways"
                app:title="@string/app_name">

        </android.support.v7.widget.Toolbar>

        <android.support.design.widget.TabLayout
                android:id="@+id/tabs"
                android:background="#ffffff"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="50"
                app:tabIndicatorColor="@color/tabIndicatorColor"
                app:tabIndicatorHeight="3dp">

            <android.support.design.widget.TabItem
                    android:id="@+id/tab_profile"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="1"/>

            <android.support.design.widget.TabItem
                    android:id="@+id/tab_notifications"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="2"/>

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

    <android.support.v4.view.ViewPager
            android:id="@+id/container"
            android:layout_weight="390"
            android:background="#ffffff"
            android:layout_width="match_parent"
            android:layout_height="0dp"/>

</LinearLayout>

fragment_notifications.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <TextView
            android:layout_width="wrap_content"
            android:text="notifications"
            android:layout_gravity="center"
            android:textAlignment="center"
            android:textSize="56sp"
            android:layout_height="wrap_content"/>
</LinearLayout>

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Если вы хотите установить заголовок своей деятельности с помощью вкладок, вам нужно установить заголовок панели действий (й) действий, которую вы можете установить из фрагмента, используя экземпляр действия.

Пример:

//initialize activity instance
lateinit var mActivity: AppCompatActivity

//get activity inside your onViewCreated of fragment
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    mActivity = activity as MainActivity

}

// inside your fragment
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
    super.setUserVisibleHint(isVisibleToUser)
    if(isVisibleToUser){
        //change your title from here, make sure that activity is not null
        mActivity.supportActionBar?.title = "Your Title"
    }
}

Позвольте мне сейчас, если у вас есть запрос! :)

0 голосов
/ 01 ноября 2018

Как я понимаю, когда пользователи проводят пальцем между вкладками, вы установите текст вкладки в качестве заголовка действия. Вот решение

Сначала удалите все теги TabItem из activity_main.xml файла макета, потому что вы используете TabLayout с ViewPager. ViewPager определит, как настроить вкладку (количество вкладок, фрагмент на каждой вкладке, заголовок на каждой вкладке и т. Д.).

<android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:background="#ffffff"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="50"
        app:tabIndicatorHeight="3dp">

    <!--<android.support.design.widget.TabItem-->
            <!--android:id="@+id/tab_profile"-->
            <!--android:layout_width="wrap_content"-->
            <!--android:layout_height="wrap_content"-->
            <!--android:text="1"/>-->

    <!--<android.support.design.widget.TabItem-->
            <!--android:id="@+id/tab_notifications"-->
            <!--android:layout_width="wrap_content"-->
            <!--android:layout_height="wrap_content"-->
            <!--android:text="2"/>-->

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

Затем измените свой код на MainActivity

container.adapter = TabPagerAdapter(supportFragmentManager)
// Comment-out or remove these lines
// container.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabs))
// tabs.addOnTabSelectedListener(TabLayout.ViewPagerOnTabSelectedListener(container))

// Pass viewpager to tablayout to setup tabs.
tabs.setupWithViewPager(container)

// Handle event when users swipe to a tab, here we set tab's text as title of the activity.
tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
    override fun onTabSelected(tab: TabLayout.Tab) {
        title = tab.text // the value of tab's text is the returned value from `getPageTitle` method in TabPagerAdapter class.
    }

    override fun onTabUnselected(tab: TabLayout.Tab?) {
    }

    override fun onTabReselected(tab: TabLayout.Tab?) {
    }
})

// For the first time open the app, we set first tab's title as title of this activity
title = container.adapter!!.getPageTitle(0)
0 голосов
/ 01 ноября 2018
viewPagerAtmosphericInfo.addOnPageChangeListener(object: ViewPager.OnPageChangeListener{
override fun onPageScrollStateChanged(state: Int) {

}

override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {

}

override fun onPageSelected(position: Int) {
   // code here
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...