美文网首页
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