标签/TabActivity 深度研究
来源:互联网 发布:305耳机在淘宝上买吗 编辑:程序博客网 时间:2024/04/27 20:11
何谓标签 印象最深刻的应该是这个
现在 我们将通过一系列的扩展来研究之
写道
1. 自定义TabActivity 使得标签处于屏幕下方
2. 各个标签所用布局 既可在 *.xml 中定义 也可在 *.java 中定义
3. 更改标签布局
2. 各个标签所用布局 既可在 *.xml 中定义 也可在 *.java 中定义
3. 更改标签布局
1. 标签页 在 屏幕下方
写道
一个典型的标签Activity 是由2 部分构成的 且其id都有规定 即:
* TabWidget 用于展示标签页 id=tabs
* FrameLayout 用于展示隶属于各个标签的具体布局 id=tabcontent
* TabWidget 用于展示标签页 id=tabs
* FrameLayout 用于展示隶属于各个标签的具体布局 id=tabcontent
* 基本布局如下:
- <?xml version="1.0" encoding="utf-8"?>
- <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/tabhost"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
- <LinearLayout
- android:orientation="vertical"
- android:gravity="bottom"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
- <FrameLayout
- android:id="@android:id/tabcontent"
- android:layout_width="fill_parent"
- android:layout_height="200dip" >
- <RelativeLayout
- android:id="@+id/view1"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:id="@+id/text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Hello to Johnny.Griffin!"
- android:layout_centerInParent="true"
- android:textStyle="bold|italic" />
- <ImageView
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:src="@drawable/robot"
- android:layout_toLeftOf="@id/text" />
- </RelativeLayout>
- <TextView
- android:id="@+id/view2"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="创新源于模仿!" />
- <TextView
- android:id="@+id/view3"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="欢迎进入 droid 世界!" />
- <ImageView
- android:id="@+id/view4"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:src="@drawable/robot" />
- </FrameLayout>
- <TabWidget
- android:id="@android:id/tabs"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
- </LinearLayout>
- </TabHost>
<?xml version="1.0" encoding="utf-8"?><TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost"android:layout_width="fill_parent" android:layout_height="fill_parent" ><LinearLayout android:orientation="vertical"android:gravity="bottom"android:layout_width="fill_parent" android:layout_height="fill_parent" ><FrameLayout android:id="@android:id/tabcontent"android:layout_width="fill_parent" android:layout_height="200dip" ><RelativeLayout android:id="@+id/view1" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello to Johnny.Griffin!" android:layout_centerInParent="true" android:textStyle="bold|italic" /><ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/robot" android:layout_toLeftOf="@id/text" /></RelativeLayout><TextViewandroid:id="@+id/view2"android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="创新源于模仿!" /> <TextViewandroid:id="@+id/view3"android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="欢迎进入 droid 世界!" /> <ImageViewandroid:id="@+id/view4"android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/robot" /></FrameLayout><TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> </TabHost>
* 得到TabHost tHost 仅在TabActivity中有效
- tHost = this.getTabHost();
tHost = this.getTabHost();
* 创建4个标签 并指定所使用的布局
- public static final String Tab1 = "Tab1";
- public static final String Tab2 = "Tab2";
- public static final String Tab3 = "Tab3";
- public static final String Tab4 = "Tab4";
- public static final String Tab5 = "Tab5";
- tHost.addTab(tHost.newTabSpec(Tab1).setIndicator("Tab 1", getResources().getDrawable(R.drawable.icon)).setContent(R.id.view1));
- tHost.addTab(tHost.newTabSpec(Tab2).setIndicator("Tab 2", getResources().getDrawable(R.drawable.beijing_small)).setContent(R.id.view2));
- tHost.addTab(tHost.newTabSpec(Tab3).setIndicator("Tab 3").setContent(R.id.view3));
- tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(R.id.view4));
public static final String Tab1 = "Tab1";public static final String Tab2 = "Tab2";public static final String Tab3 = "Tab3";public static final String Tab4 = "Tab4";public static final String Tab5 = "Tab5";tHost.addTab(tHost.newTabSpec(Tab1).setIndicator("Tab 1", getResources().getDrawable(R.drawable.icon)).setContent(R.id.view1)); tHost.addTab(tHost.newTabSpec(Tab2).setIndicator("Tab 2", getResources().getDrawable(R.drawable.beijing_small)).setContent(R.id.view2)); tHost.addTab(tHost.newTabSpec(Tab3).setIndicator("Tab 3").setContent(R.id.view3)); tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(R.id.view4));
* 设定监听器 用于监听 标签间切换事件
- tHost.setOnTabChangedListener(new OnTabChangeListener(){
- @Override
- public void onTabChanged(String tabId) {
- // TODO Auto-generated method stub
- }
- });
tHost.setOnTabChangedListener(new OnTabChangeListener(){@Overridepublic void onTabChanged(String tabId) {// TODO Auto-generated method stub} });
* emulator 运行情况:
2. 在 *.java 中定义标签所需布局
- public class CustomLayout implements TabHost.TabContentFactory {
- Activity activity;
- LayoutInflater inflaterHelper;
- LinearLayout layout;
- public CustomLayout (Activity a) {
- activity = a;
- inflaterHelper = a.getLayoutInflater();
- }
- /** {@inheritDoc} *///tag 标记各个标签
- public View createTabContent(String tag) {
- return addCustomView(tag);
- }
- public View addCustomView(String id){
- layout = new LinearLayout(activity);
- layout.setOrientation(LinearLayout.VERTICAL);
- if(id.equals(Tab1)){
- ImageView iv = new ImageView(activity);
- iv.setImageResource(R.drawable.beijing_big);
- layout.addView(iv,
- new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
- }
- else if(id.equals(Tab2)){
- EditText edit = new EditText(activity);
- layout.addView(edit,
- new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
- Button btn = new Button(activity);
- btn.setText("OK");
- btn.setWidth(100);
- layout.addView(btn,
- new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
- RadioGroup rGroup = new RadioGroup(activity);
- rGroup.setOrientation(LinearLayout.HORIZONTAL);
- RadioButton radio1 = new RadioButton(activity);
- radio1.setText("Radio A");
- rGroup.addView(radio1);
- RadioButton radio2 = new RadioButton(activity);
- radio2.setText("Radio B");
- rGroup.addView(radio2);
- layout.addView(rGroup,
- new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
- }
- else if(id.equals(Tab3)){
- LinearLayout.LayoutParams param3 =
- new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
- layout.addView(inflaterHelper.inflate(R.layout.hello, null),param3);
- }
- else if(id.equals(Tab4)){
- TextView tv = new TextView(activity);
- tv.setText("HelloTags!");
- tv.setGravity(Gravity.CENTER);
- layout.addView(tv);
- }
- return layout;
- }
- }
public class CustomLayout implements TabHost.TabContentFactory { Activity activity; LayoutInflater inflaterHelper; LinearLayout layout; public CustomLayout (Activity a) { activity = a; inflaterHelper = a.getLayoutInflater(); } /** {@inheritDoc} *///tag 标记各个标签 public View createTabContent(String tag) { return addCustomView(tag); } public View addCustomView(String id){ layout = new LinearLayout(activity); layout.setOrientation(LinearLayout.VERTICAL); if(id.equals(Tab1)){ ImageView iv = new ImageView(activity); iv.setImageResource(R.drawable.beijing_big); layout.addView(iv, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT)); } else if(id.equals(Tab2)){ EditText edit = new EditText(activity); layout.addView(edit, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT)); Button btn = new Button(activity); btn.setText("OK"); btn.setWidth(100); layout.addView(btn, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT)); RadioGroup rGroup = new RadioGroup(activity); rGroup.setOrientation(LinearLayout.HORIZONTAL); RadioButton radio1 = new RadioButton(activity); radio1.setText("Radio A"); rGroup.addView(radio1); RadioButton radio2 = new RadioButton(activity); radio2.setText("Radio B"); rGroup.addView(radio2); layout.addView(rGroup, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); } else if(id.equals(Tab3)){ LinearLayout.LayoutParams param3 = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); layout.addView(inflaterHelper.inflate(R.layout.hello, null),param3); } else if(id.equals(Tab4)){ TextView tv = new TextView(activity); tv.setText("HelloTags!"); tv.setGravity(Gravity.CENTER); layout.addView(tv); } return layout; } }
* 如何使用:
- CustomLayout ct = new CustomLayout(this);
- tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(ct));
CustomLayout ct = new CustomLayout(this);tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(ct));
* emulator 运行结果:
3. 改变标签布局
写道
可能很多人对TabActivity 不满意 原因之一:其很不美观 而不美观的根源就是:标签的问题 其图像和文字相互覆盖 导致的
那么 我们可以自己扩展么? 当然
那么 我们可以自己扩展么? 当然
写道
TabWidget 理解:
1. TabWidget 为 horizontal 的 LinearLayout
2. 且 其包含的标签又是一个RelativeLayout
3. 每个标签RelativeLayout 里面包含2个View: TextView ImageView
1. TabWidget 为 horizontal 的 LinearLayout
2. 且 其包含的标签又是一个RelativeLayout
3. 每个标签RelativeLayout 里面包含2个View: TextView ImageView
因此 我们甚至可以推算出其布局为:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <RelativeLayout
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <ImageView />
- <TextView />
- </RelativeLayout>
- <RelativeLayout
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <ImageView />
- <TextView />
- </RelativeLayout>
- <RelativeLayout
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <ImageView />
- <TextView />
- </RelativeLayout>
- <RelativeLayout
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <ImageView />
- <TextView />
- </RelativeLayout>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" ><RelativeLayoutandroid:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content"><ImageView /> <TextView /></RelativeLayout><RelativeLayoutandroid:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content"><ImageView /> <TextView /></RelativeLayout><RelativeLayoutandroid:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content"><ImageView /> <TextView /></RelativeLayout><RelativeLayoutandroid:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content"><ImageView /> <TextView /></RelativeLayout></LinearLayout>
* 去掉系统默认的布局 即 在 setIndicator() 中置空 修改如下:
- tHost.addTab(tHost.newTabSpec(Tab1).setIndicator("").setContent(ct));
tHost.addTab(tHost.newTabSpec(Tab1).setIndicator("").setContent(ct));
写道
可能有人会说:那我不调用setIndicator() 不久可以了么 不行 否则 会报错
* 自己定义布局 并 指定显示的内容
- public View composeLayout(String s, int i){
- LinearLayout layout = new LinearLayout(this);
- layout.setOrientation(LinearLayout.VERTICAL);
- TextView tv = new TextView(this);
- tv.setGravity(Gravity.CENTER);
- tv.setSingleLine(true);
- tv.setText(s);
- layout.addView(tv,
- new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
- ImageView iv = new ImageView(this);
- iv.setImageResource(i);
- layout.addView(iv,
- new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
- return layout;
- }
public View composeLayout(String s, int i){ LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); TextView tv = new TextView(this); tv.setGravity(Gravity.CENTER); tv.setSingleLine(true); tv.setText(s); layout.addView(tv, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); ImageView iv = new ImageView(this); iv.setImageResource(i); layout.addView(iv, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); return layout; }
* 得到 TabWidget 实例 tw
- LinearLayout ll=(LinearLayout)tHost.getChildAt(0);
- tw =(TabWidget)ll.getChildAt(1);
LinearLayout ll=(LinearLayout)tHost.getChildAt(0); tw =(TabWidget)ll.getChildAt(1);
* 得到 TabWidget 内的具体某个Layout 并使用上面的布局 composeLayout()
- public void updateWidgetView(int i,String text,int image){
- RelativeLayout rl =(RelativeLayout)tw.getChildAt(i);
- rl.addView(composeLayout(text,image));
- }
public void updateWidgetView(int i,String text,int image){ RelativeLayout rl =(RelativeLayout)tw.getChildAt(i); rl.addView(composeLayout(text,image)); }
* emulator 运行截图 // 前面 3个是使用新布局 最后一个是使用TabActivity 默认的布局 哪个好看 大家自己选择之
that's all!
- 标签/TabActivity 深度研究
- 标签/TabActivity 深度研究
- 标签/TabActivity 深度研究
- 标签/TabActivity 深度研究
- 标签/TabActivity 深度研究
- TabActivity 深度研究(非常好的总结,谢谢原创者)
- TabActivity标签界面的实现
- TabActivity,LocalActivityManager,TabHost,TabWidget深度分析
- TabActivity,LocalActivityManager,TabHost,TabWidget深度分析
- 改变TabActivity标签大小,显示ICON
- TabActivity中的Tab标签详细设置
- 十三.创建一个TabActivity标签页
- TabActivity中的Tab标签详细设置
- TabActivity中的Tab标签详细设置
- TabActivity
- TabActivity
- TabActivity
- TabActivity
- 数学之美--贝塞尔曲线
- 理解MFC中的“资源”概念
- C语言研究性学习的路线之号外:一些朋友所提问题的反馈及第9章 指针
- 常用Python第三方库 简介
- Linux-2.6.32 + arm-linux-gcc-4.4.3 + 2.6.32-at91.patch.gz 内核编译
- 标签/TabActivity 深度研究
- Json的使用
- android 下使用GPS 无法获取经纬度的解决方法
- 如何在Ubuntu下编辑PDF文件
- win 7 音频问题
- 啊~北京~~啊~首都~
- PYTHON单元测试模块unittest
- 每天一事
- VTP(VLAN Trunking Protocol) - Pruning