前言
作为一个读者变成一个写技术文章的作者,我决定坚持还是写一些简单实用的文章(毕竟理论太高深,也许看的人很蛋疼。。。。我也相信如果有兴趣深入研究,必然会自己找百度的),好了言归真转。
主题内容
在我们的Android
开发旅途中,我们不可避免的要处理一种情况就是:在同一个Activity
界面里,切换不同的界面。那常用的手法有哪些呢?我总结一下大致分为三种:
[1] TabHost
,[2]Button
配合Fragment
,[3]Menu
。下面我将逐一的介绍一下相关用法
TabHost
关于TabHost很多朋友知道,但是却不怎么了解。
盛放Tab的容器就是TabHost。TabHost的实现有两种方式:
第一种继承TabActivity,从TabActivity中用getTabHost()方法获取TabHost。各个Tab中的内容在布局文件中定义就行了。
第二种方式,不继承TabActivity,在布局文件中定义TabHost即可,但是TabWidget的id必须是@android:id/tabs,FrameLayout的id必须是@android:id/tabcontent。
让我们一起看看继承TabActivity的写法:
先看main.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- 定义TabHost组件 -->
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent">
<!-- 定义第一个标签页的内容 -->
<LinearLayout android:id="@+id/tab01" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<!-- 定义两个TextView用于显示标签页中的内容 -->
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="张老师"/>
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="李老师"/>
</LinearLayout>
<!-- 定义第二个标签页的内容 -->
<LinearLayout android:id="@+id/tab02" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="陈老师"/>
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="游老师"/>
</LinearLayout>
</TabHost>
再看Activity的写法
public class MyActivity extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//调用TabActivity的getTabHost()方法获取TabHost对象
TabHost tabHost = getTabHost();
//设置使用TabHost布局
LayoutInflater.from(this).inflate(R.layout.main, tabHost.getTabContentView(),true);
//添加第一个标签页
tabHost.addTab(tabHost.newTabSpec("tab01").setIndicator("数学老师").setContent(R.id.tab01));
//添加第二个标签页,并在其标签上添加一个图片
tabHost.addTab(tabHost.newTabSpec("tab02").setIndicator("语文老师",getResources().getDrawable(R.drawable.icon)).setContent(R.id.tab02));
}
}
还有不继承TabActivity的写法
继承普通Activity
,<TabWidget>
标签id必须为tabs
、<FrameLayout>
标签id
必须为tabcontent
.这个方式在通过findViewById
获得TabHost
之后,必须要调用setup
方法。
先看main.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- TabHost必须包含一个 TabWidget和一个FrameLayout-->
<TabHost android:id="@+id/tabhost" android:layout_width="fill_parent" android:layout_height="wrap_content">
<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<!-- TabWidget的id属性必须为 @android:id/tabs-->
<TabWidget android:id="@android:id/tabs" android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<!-- FrameLayout的id属性必须为 @android:id/tabcontent-->
<FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="fill_parent">
<!-- 定义第一个标签页的内容 -->
<LinearLayout android:id="@+id/tab01" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<!-- 定义两个TextView用于显示标签页中的内容 -->
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="张老师"/>
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="李老师"/>
</LinearLayout>
<!-- 定义第二个标签页的内容 -->
<LinearLayout android:id="@+id/tab02" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="陈老师"/>
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="游老师"/>
</LinearLayout>
</FrameLayout>
</LinearLayout>
</TabHost>
</LinearLayout>
再看Activity的写法
public class TabHostTest extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获取TabHost对象
TabHost tabHost = (TabHost) findViewById(R.id.tabhost);
// 如果没有继承TabActivity时,通过该种方法加载启动tabHost(!!!!!!!!!!!!!!!!!!!)
tabHost.setup();
tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("数学老师",
getResources().getDrawable(R.drawable.icon)).setContent(
R.id.view1));
tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("语文老师")
.setContent(R.id.view2));
}
}
如果我们需要对TabHost的点击事件进行监听处理,我们可以这样
mTabHost.setOnTabChangedListener(new MyTabChangedListener());
private class MyTabChangedListener implements TabHost.OnTabChangeListener {
@Override
public void onTabChanged(String tabId) {
//根据自身的业务需求处理相应的操作
}
}
以上就是TabHost的基本用法
Button配合Fragment
这个方式我相信广大IT朋友再熟悉不过了,直接上代码
先看main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center" >
<fragment
android:id="@+id/math_fragment"
android:name="com.itfanr.fragmenttab.MathFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="10" />
<fragment
android:id="@+id/chinese_fragment"
android:name="com.itfanr.fragmenttab.ChineseFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="10" />
<RadioGroup
android:id="@+id/bottomRg"
android:layout_width="fill_parent"
android:layout_height="20dp"
android:layout_weight="0.5"
android:orientation="horizontal"
android:gravity="center">
<RadioButton
android:id="@+id/rbOne"
android:background="@drawable/ofm_collect_icon"
android:checked="true"
android:text="数学老师" />
<RadioButton
android:id="@+id/rbTwo"
android:background="@drawable/ofm_collect_icon"
android:text="语文老师" />
</RadioGroup>
</LinearLayout>
再看Activity的写法
public class MainActivity extends Activity {
private Fragment[] mFragments;
private RadioGroup bottomRg;
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
private RadioButton rbOne, rbTwo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mFragments = new Fragment[2];
fragmentManager = this.getFragmentManager();
mFragments[0] = fragmentManager.findFragmentById(R.id.math_fragment);
mFragments[1] = fragmentManager.findFragmentById(R.id.chiese_fragment);
fragmentTransaction = fragmentManager.beginTransaction()
.hide(mFragments[0]).hide(mFragments[1]);
fragmentTransaction.show(mFragments[0]).commit();
setFragmentIndicator() ;
}
private void setFragmentIndicator() {
this.bottomRg = (RadioGroup) findViewById(R.id.bottomRg);
this.rbOne = (RadioButton) findViewById(R.id.rbOne);
this.rbTwo = (RadioButton) findViewById(R.id.rbTwo);
bottomRg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
fragmentTransaction = fragmentManager.beginTransaction()
.hide(mFragments[0]).hide(mFragments[1]);
switch (checkedId) {
case R.id.rbOne:
fragmentTransaction.show(mFragments[0]).commit();
break;
case R.id.rbTwo:
fragmentTransaction.show(mFragments[1]).commit();
break;
default:
break;
}
}
});
}
以上是Button配合Fragment的写法,小小的拓展一下知识点:关于Activity跟Fragment的生命周期的关系区别有兴趣可以点击http://blog.csdn.net/zjclugger/article/details/10442335查看详情
Menu
这里我就讲解一下代码设置Menu的做法,XML的做法比较简单就不一一说明了
直接在Activity内部完成操作
//重写菜单事件
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 1, 1, "数学老师");
menu.add(0, 2, 2, "语文老师");
return super.onCreateOptionsMenu(menu);
}
//给对应菜单选项注册点击事件
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 1:
//显示数学老师的内容跟button的显示方式类似
break;
case 2:
//显示语文老师的内容跟button的显示方式类似
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
总结
关于这三种切换界面的基本手法的分析,我已经介绍完了,然后我们再分析一下什么时候用什么手法比较合适。如果你对按钮的显示效果有要求(如不同的情形显示不同的按钮展示效果),推荐第二种。如果是按钮比较少的时候,操作又想比较简单,推荐TabHost。如果按钮很多,却又不想显示在界面上的,那Menu的手法就是不二的首选。感谢大家的阅读,有需要的朋友欢迎收藏,哈哈。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。