效果参考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导航
网友评论