前言
作为一个读者变成一个写技术文章的作者,我决定坚持还是写一些简单实用的文章(毕竟理论太高深,也许看的人很蛋疼。。。。我也相信如果有兴趣深入研究,必然会自己找百度的),好了言归真转。
主题内容
在我们的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
再看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
,
标签id必须为tabs
、
标签id
必须为tabcontent
.这个方式在通过findViewById
获得TabHost
之后,必须要调用setup
方法。
先看main.xml
再看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
再看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的手法就是不二的首选。感谢大家的阅读,有需要的朋友欢迎收藏,哈哈。