TabHost的自定义
使用自定义的TabHost可以不用继承TabActicity,但是要注意的是如果使用Activity作为Content的话,有两处代码是一定要加的。不然就会出现RuntimeError,还有在XML布局中使用自定义的TabHost时除了TabHost的id自定义外,LinearLayout和TabWidget的id必须使用系统默认。具体可参考下面的Demo。
使用TabWidget的效果(左)和自定义View的效果图(右):
MainActivity加载的XML布局:
<RelativeLayout 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"
tools:context=".MainActivity" > <TabHost
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" > <TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0" /> <FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" />
</LinearLayout>
</TabHost> </RelativeLayout>
MainActivity的Java代码(注意红色代码):
package com.hitech.tabhostdemo; import android.app.Activity;
import android.app.LocalActivityManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec; @SuppressWarnings("deprecation")
public class MainActivity extends Activity { private LocalActivityManager lam;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); TabHost tabHost = (TabHost) findViewById(R.id.tabhost); // Intent对象
Intent intent1 = new Intent(this, TabSpecActivity1.class);
Intent intent2 = new Intent(this, TabSpecActivity2.class);
Intent intent3 = new Intent(this, TabSpecActivity3.class); // TabSpec对象
TabSpec tabSpec1 = tabHost.newTabSpec("first");
tabSpec1.setIndicator("第一页",
getResources().getDrawable(android.R.drawable.ic_dialog_email));
tabSpec1.setContent(intent1); TabSpec tabSpec2 = tabHost.newTabSpec("second");
tabSpec2.setIndicator("第二页",
getResources().getDrawable(android.R.drawable.ic_btn_speak_now));
tabSpec2.setContent(intent2); TabSpec tabSpec3 = tabHost.newTabSpec("third");
tabSpec3.setIndicator("第三页",
getResources().getDrawable(android.R.drawable.ic_dialog_dialer));
tabSpec3.setContent(intent3); lam = new LocalActivityManager(this, false);
lam.dispatchCreate(savedInstanceState);
tabHost.setup(lam);
tabHost.addTab(tabSpec1);
tabHost.addTab(tabSpec2);
tabHost.addTab(tabSpec3); // TabActivity
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
} @Override
protected void onPause() {
super.onPause();
lam.dispatchPause(isFinishing());
}
}
自定义View代替TabWidget效果的实现原理:隐藏TabWidget,然后在线性布局中加入自定义View,如上图中即为LinearLayout中添加三个TextView,再分别对TextView设置点击事件来模拟TabWidget的效果。
同样,MainActivity加载的XML布局如下:
<RelativeLayout 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"
tools:context=".MainActivity" > <TabHost
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" > <TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:orientation="horizontal"android:visibility="gone" /> <FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" /> <View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginBottom="1dp"
android:background="@android:color/background_light" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" > <TextView
android:id="@+id/tab_convst"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawablePadding="-10dp"
android:drawableTop="@drawable/ic_widget_conversation"
android:gravity="center"
android:paddingBottom="5dp"
android:text="@string/conversation" /> <TextView
android:id="@+id/tab_folder"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawablePadding="-10dp"
android:drawableTop="@drawable/ic_widget_folder"
android:gravity="center"
android:paddingBottom="5dp"
android:text="@string/folder" /> <TextView
android:id="@+id/tab_group"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawablePadding="-10dp"
android:drawableTop="@drawable/ic_widget_group"
android:gravity="center"
android:paddingBottom="5dp"
android:text="@string/group" />
</LinearLayout>
</LinearLayout>
</TabHost> </RelativeLayout>
注意和以往不同之处已做标记,分别是TabWidget和自定义的LinearLayout。
MainActivity中的处理:
package com.hitech.capacitymessage; import android.app.Activity;
import android.app.LocalActivityManager;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;
import android.widget.TextView; @SuppressWarnings("deprecation")
public class MainActivity extends Activity implements OnClickListener { private static final String TAG = "MainActivity";
private LocalActivityManager lam;
private TabHost tabHost;
private Bundle state;
private TabSpec tab1;
private TabSpec tab2;
private TabSpec tab3; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.state = savedInstanceState;
activityInitializer();
} private void activityInitializer() {
tabHost = (TabHost) findViewById(R.id.tabhost);
tab1 = tabHost.newTabSpec("tab1");
tab1.setIndicator("会话",
getResources().getDrawable(R.drawable.ic_widget_conversation));
tab1.setContent(new Intent(this, TabActivity1.class)); tab2 = tabHost.newTabSpec("tab2");
tab2.setIndicator("文件夹",
getResources().getDrawable(R.drawable.ic_widget_folder));
tab2.setContent(new Intent(this, TabActivity2.class)); tab3 = tabHost.newTabSpec("tab3");
tab3.setIndicator("群组",
getResources().getDrawable(R.drawable.ic_widget_group));
tab3.setContent(new Intent(this, TabActivity3.class)); lam = new LocalActivityManager(this, true);
lam.dispatchCreate(state);
tabHost.setup(lam); tabHost.addTab(tab1);
tabHost.addTab(tab2);
tabHost.addTab(tab3); TextView block1 = (TextView) findViewById(R.id.tab_convst);
TextView block2 = (TextView) findViewById(R.id.tab_folder);
TextView block3 = (TextView) findViewById(R.id.tab_group); block1.setOnClickListener(this);
block2.setOnClickListener(this);
block3.setOnClickListener(this);
} @Override
public void onClick(View v) {
String tabTag = tabHost.getCurrentTabTag();
switch (v.getId()) {
case R.id.tab_convst:
if (!tabTag.equals("tab1")) {
tabHost.setCurrentTabByTag("tab1");
}
Log.e(TAG, tabHost.getCurrentTabTag());
break;
case R.id.tab_folder:
if (!tabTag.equals("tab2")) {
tabHost.setCurrentTabByTag("tab2");
}
Log.e(TAG, tabHost.getCurrentTabTag());
break;
case R.id.tab_group:
if (!tabTag.equals("tab3")) {
tabHost.setCurrentTabByTag("tab3");
}
Log.e(TAG, tabHost.getCurrentTabTag());
break;
default:
break;
}
} @Override
protected void onPause() {
super.onPause();
lam.dispatchPause(isFinishing());
}
}
TabHost的自定义的更多相关文章
- 【读书笔记《Android游戏编程之从零开始》】6.Android 游戏开发常用的系统控件(TabHost、ListView)
3.9 TabSpec与TabHost TabHost类官方文档地址:http://developer.android.com/reference/android/widget/TabHost.htm ...
- TabHost自定义外观
博客园:http://www.cnblogs.com 农民伯伯: http://www.cnblogs.com/over140 版本 新浪微博 weibo_10235010.apk 正文 一.效果图 ...
- 使用自定义RadioButton和ViewPager实现TabHost效果和带滑动的页卡效果
在工作中又很多需求都不是android系统自带的控件可以达到效果的,内置的TabHost就是,只能达到简单的效果 ,所以这个时候就要自定义控件来达到效果:这个效果就是: 使用自定义RadioButto ...
- android自定义tabhost,tabcontent用intent获得
地址:http://my.oschina.net/aowu/blog/36282 自己改的自定义tabhost组建,效果图如左.有更好的朋友可以相互交流一下,嘿嘿. 1.先上AndroidManife ...
- 自定义TabHost,TabWidget样式
先看效果: 京东商城底部菜单栏 新浪微博底部菜单栏 本次学习效果图:
- 安卓自定义类似TabHost的导航栏
有时候为了项目需要我们要自定义一些导航控件,类似下面这样. 下面给大家讲讲我是怎么实现的, 1.素材准备(这个都是美工的事情) 2.①资源文件共有五个 如下: activity_main_first. ...
- Android 自定义TabHost,TabWidget样式
界面比较简单,要想做得漂亮换几张图片就可以了. 第一步:先在布局(这里用了main.xml创建时自动生成的)里面放上TabHost ,只要将TabHost控件托至屏幕中就可: <?xml ver ...
- Android 实现分页(使用TabWidget/TabHost)
注:本文为转载,但该内容本人已亲身尝试,确认该方法可行,代码有点小的改动,转载用作保存与分享. 原作者地址:http://gundumw100.iteye.com/blog/853967 个人吐嘈:据 ...
- 利用TabHost制作QQ客户端标签栏效果(低版本QQ)
学习一定要从基础学起,只有有一个好的基础,我们才会变得更加的perfect 下面小编将利用TabHost制作QQ客户端标签栏效果(这个版本的QQ是在前几年发布的)…. 首先我们看一下效果: 看到这个界 ...
随机推荐
- org.hibernate.AssertionFailure: null id in com.you.model.User entry (don't flush the Session after a
1.错误描写叙述 org.hibernate.AssertionFailure: null id in com.you.model.User entry (don't flush the Sessio ...
- 从头认识java-15.3 使用HashSet须要注意的地方
这一章节我们来讨论一下使用Set的各种实现须要注意的地方. Set接口的经常使用实现类有:HashSet.TreeSet,LinkedHashSet 1.HashSet 大家对于HashSet的印象都 ...
- 几个常用ORACLE运维监控的SQL语句
1.消耗CPUSELECT a.CPU_TIME, --CPU时间 百万分之一(微秒) a.OPTIMIZER_MODE,--优化方式 a.EXEC ...
- 固比固布局 圣杯布局 css实现传统手机app布局
手机app的布局大致上都是头部.内容.底部三部分: 我们需要实现的是头部.底部高度固定:中间内容区域自适应且可以滚动:直接贴代码: css: html,body { width: 100%; heig ...
- vue中的swiper element ui
欢迎加入前端交流群交流知识&&获取视频资料:749539640 很多同学问,怎么把swiper引入到vue的脚手架里去,之前的一篇博客有提到怎么引入,但是后来感觉不怎么好,还是用一些v ...
- win-visualviewport-space
html.win-hoverable <div class="win-visualviewport-space"></div> <section cl ...
- Android 设计一个菱形形状的Imageview组件.
网上没有资料,特来请教下大神 Android 设计一个菱形形状的Imageview组件. >> android这个答案描述的挺清楚的:http://www.goodpm.net/postr ...
- POJ 2367 Genealogical tree【拓扑排序】
题意:大概意思是--有一个家族聚集在一起,现在由家族里面的人讲话,辈分高的人先讲话.现在给出n,然后再给出n行数 第i行输入的数表示的意思是第i行的子孙是哪些数,然后这些数排在i的后面. 比如样例 5 ...
- ActiveMQ学习笔记(5)----Broker的启动方式
Broker:相当于一个ActiveMQ服务器实例,在实际的开发中我们可以启动多个Broker. 命令行启动参数示例如下: 1. activemq start 使用默认的activemq.xml来启动 ...
- GCD - Extreme (II) UVA - 11426 欧拉函数_数学推导
Code: #include<cstdio> using namespace std; const int maxn=4000005; const int R=4000002; const ...