TabHost我们都知道是用来实现导航栏布局来切换页面的,这个也是元老级的控件了,现在逐渐被TabLayout,BottomNavigationBar,使用RadioButton自定义。。。等等给取代了。TabHost有个好处就是它添加的是Activity而不像上面那些全部使用Fragment来显示内容。
1.实现的效果图
2.主布局中使用TabHost
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<!--添加选项卡容器-->
<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</TabHost>
3.我们需要对个页面进行状态保存,自定义了底部布局。注释都写的很清楚
public class MainActivity extends AppCompatActivity {
//用于添加每一个选项卡的id
private String[] tags = {"A_tag", "B_tag", "C_tag", "D_tag"};
//所添加选项卡的文本信息
private String[] titles = {"新闻", "图片", "视频", "收藏"};
//所添加选项卡的图片信息
private int[] images = {R.drawable.baoming, R.drawable.jiakao,
R.drawable.maiche, R.drawable.xueche};
//用于跳转至不同的Activity
private Intent[] intents = new Intent[4];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TabHost tabHost = (TabHost) findViewById(R.id.tabhost);
TabWidget tabWidget = (TabWidget) findViewById(android.R.id.tabs);
// tabWidget.setDividerDrawable(null);//设置tabWeight没有竖线分割
tabWidget.setBackgroundColor(Color.WHITE);
//初始化activity管理者
LocalActivityManager manager = new LocalActivityManager(MainActivity.this, false);
//通过管理者保存当前页面状态
manager.dispatchCreate(savedInstanceState);
//将管理者类对象添加至TabHost
tabHost.setup(manager);
init_intent();
for (int i = 0; i < intents.length; i++) {
//加载底部导航栏布局
LayoutInflater inflater = this.getLayoutInflater();
View view = inflater.inflate(R.layout.tab, null);
TextView textView = (TextView) view.findViewById(R.id.tv_item);
ImageView imageView = (ImageView) view.findViewById(R.id.image);
textView.setText(titles[i]);
imageView.setImageResource(images[i]);
//创建选项卡
TabHost.TabSpec spec = tabHost.newTabSpec(tags[i]);
spec.setIndicator(view);
//设置每个页面的内容
spec.setContent(intents[i]);
//将创建的选项卡添加至tabHost上
tabHost.addTab(spec);
}
}
//每个页面放置的Activity
public void init_intent() {
intents[0] = new Intent(this, NewsActivity.class);
intents[1] = new Intent(this, PhotoActivity.class);
intents[2] = new Intent(this, VideoActivity.class);
intents[3] = new Intent(this, CollectionActivity.class);
}
}
4.如果你只需要添加文字而不用图片的话,只需要将for循环内的代码稍稍改一点就OK了
for (int i = 0; i < intents.length; i++) {
TabHost.TabSpec spec = tabHost.newTabSpec(tags[i]);
spec.setIndicator(titles[i]);//设置文字
spec.setContent(intents[i]);//设置内容
//将创建的选项卡添加至tabHost上
tabHost.addTab(spec);
}
5.底部tabWidget的布局tab.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<!--tabWeight布局-->
<ImageView
android:id="@+id/image"
android:layout_width="24dp"
android:layout_height="24dp" />
<TextView
android:id="@+id/tv_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/color"
android:textSize="20sp" />
</LinearLayout>
6.使用TabHost的时候,当你页面内有输入框的时候你会发现输入法会把底部tabWeight顶起来。我们可以在注册activity的时候对输入法做一些限制
<activity android:name=".MainActivity"
android:windowSoftInputMode="stateHidden|adjustPan" />
7.android:windowSoftInputMode一些属性的介绍
“stateUnspecified” 软键盘的状态(是否它是隐藏或可见)没有被指定。系统将选择一个合适的状态或依赖于主题的设置。这个是为了软件盘行为默认的设置。
“stateUnchanged” 软键盘被保持无论它上次是什么状态,是否可见或隐藏,当主窗口出现在前面时。
“stateHidden” 当用户选择该Activity时,软键盘被隐藏——也就是,当用户确定导航到该Activity时,而不是返回到它由于离开另一个Activity。
“stateAlwaysHidden” 软键盘总是被隐藏的,当该Activity主窗口获取焦点时。
“stateVisible” 软键盘是可见的,当那个是正常合适的时(当用户导航到Activity主窗口时)。
“stateAlwaysVisible” 当用户选择这个Activity时,软键盘是可见的——也就是,也就是,当用户确定导航到该Activity时,而不是返回到它由于离开另一个Activity。
“adjustUnspecified” 它不被指定是否该Activity主窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局视图能够滚动他们的内容。如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。这个是主窗口默认的行为设置。
“adjustResize” 该Activity主窗口总是被调整屏幕的大小以便留出软键盘的空间。
“adjustPan” 该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。