美文网首页
kotlin下使用ActionBar实现Tab导航

kotlin下使用ActionBar实现Tab导航

作者: ZYiDa | 来源:发表于2019-04-09 15:27 被阅读0次

效果参考iOS下的Segmented Control
结构:采取ActionBar+Fragment来实现Tab导航
第一步:定义一个简单的布局容器用来盛装Fragment
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        tools:context=".MainActivity">
</LinearLayout>

DummyFragment.kt

package com.zcz.demo.tabnavigation

import android.app.Fragment
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView

const val ARG_SECTION_NUMBER = "section_number"
class DummyFragment:Fragment(){
    //该方法的返回值就是Fragment显示的View组件
    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        val textView = TextView(activity);
        textView.gravity = Gravity.CENTER_HORIZONTAL;
        //获取创建该Fragment时传入的参数Bundle
        val args = arguments;
        textView.text = args.getInt(ARG_SECTION_NUMBER).toString()+""
        textView.textSize = 30f;
        return textView
    }
}

MainActivity.kt

package com.zcz.demo.tabnavigation

import android.app.ActionBar
import android.app.Activity
import android.app.FragmentTransaction
import android.os.Bundle

const val SELECTED_ITEM = "selected_item"

class MainActivity : Activity() ,ActionBar.TabListener{

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

        var actionBar = actionBar
        //设置ActionBar的导航方式:tab导航
        actionBar.navigationMode = ActionBar.NAVIGATION_MODE_TABS
        //依次添加三个Tab标签,并为三个Tab标签添加事件监听器
        actionBar.addTab(actionBar.newTab().setText("第一页").setTabListener(this@MainActivity))
        actionBar.addTab(actionBar.newTab().setText("第二页").setTabListener(this@MainActivity))
        actionBar.addTab(actionBar.newTab().setText("第三页").setTabListener(this@MainActivity))
    }

    override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
        super.onRestoreInstanceState(savedInstanceState)
        if (savedInstanceState!!.containsKey(SELECTED_ITEM)){
            //选中前面保存额索引值
            actionBar.setSelectedNavigationItem(savedInstanceState.getInt(SELECTED_ITEM))
        }
    }

    override fun onSaveInstanceState(outState: Bundle?) {
        super.onSaveInstanceState(outState)
        //将当前选中的fragment页的索引值保存到Bundle中
        outState!!.putInt(SELECTED_ITEM,actionBar!!.selectedNavigationIndex)
    }

    override fun onTabUnselected(tab: ActionBar.Tab?, ft: FragmentTransaction?) {

    }

    //A当指定Tab标签被选中时激发该方法
    override fun onTabSelected(tab: ActionBar.Tab?, ft: FragmentTransaction?) {
        val fragment = DummyFragment()
        val args = Bundle()
        args.putInt(ARG_SECTION_NUMBER,tab!!.position + 1)
        fragment.arguments = args;
        //获取FragmentTransactoni 对象
        val ft = fragmentManager.beginTransaction()
        //使用fragment代替Activity中的container组件
        ft.replace(R.id.container,fragment);
        //提交事务
        ft.commit()
    }

    override fun onTabReselected(tab: ActionBar.Tab?, ft: FragmentTransaction?) {

    }
}

效果图如下:


Tab+Fragment导航

相关文章

网友评论

      本文标题:kotlin下使用ActionBar实现Tab导航

      本文链接:https://www.haomeiwen.com/subject/htobiqtx.html