- 浏览: 128644 次
- 性别:
- 来自: 成都
最新评论
-
yi_chao_jiang:
你好,多谢分享,问个问题,在上传数据的时候判断文件是否有上传记 ...
断点续传和下载原理分析 -
a41606709:
为什么我的tabhost显示不出来? 怎么设置在全部页面中让他 ...
TabActivity中的Tab标签详细设置 -
Zero颴:
大神篇,思路,配图都很清晰,perfect!
Android事件模型之interceptTouchEvnet ,onTouchEvent关系正解 -
QAZ503602501:
牛死人了!!!
B-树 -
mengsina:
很牛的文档。数学功底好啊
Android Matrix理论与应用详解
参考链接:
http://www.iteye.com/topic/602737
这个写的很不错,我是跟着一步步写下来的,不过到最后也遇到了麻烦,就是不能将Tab标签的文字和图片分开,始终是重合的,而且每个具体的代码,还是搞了许久才出来,故而分享之,希望能给大家带来方便,也谢谢下面的高人,呵呵!
http://www.youmi.net/bbs/thread-102-1-4.html
这个和上面的代码是一样的,不过代码不全,对于初学者来说,考验的时候来了,完善就是提高的过程,不要怕麻烦!
下面就根据上面的参考自己写的,当然大部分是相同的,不过有详细的注释,完整的代码
如果有什么不明白就留言吧!呵呵
首先结果图:
图1:
图2:
图3:
当然界面没有前面的仁兄好看,我是讲究实用,美化需要自己慢慢做了
呵呵
下面直接代码:
package com.woclub.tabactivitytest; import android.app.TabActivity; import android.content.res.ColorStateList; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TabHost; import android.widget.TabWidget; import android.widget.TextView; import android.widget.TabHost.OnTabChangeListener; /** * 总结:在设置Tab的布局的时候首先需要newTabSpec再在其设置setIndicator(Tab名字,Tab的图标), * 尤其需要注意setContent(),它有三种使用方法setContent(int)它是直接在布局文件中设置其布局, * setContent(Intent)可以用Intent指定一个Activity, * setContent(TabContentFactory)可以用一个类来指定其布局的方式 * @author Administrator * */ public class MainActivity extends TabActivity { private static final String Tab1 = "Tab1"; private static final String Tab2 = "Tab2"; private static final String Tab3 = "Tab3"; private static final String Tab4 = "Tab4"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //1得到TabHost对象,正对TabActivity的操作通常都有这个对象完成 final TabHost tabHost = this.getTabHost(); final TabWidget tabWidget = tabHost.getTabWidget(); //2生成一个Intent对象,该对象指向一个Activity,当然现在例子比较简单就没有绑定其他的Activity故而不用 //3生成一个TabSpec对象,这个对象代表了一个Tab页 TabHost.TabSpec tabSpec = tabHost.newTabSpec(Tab1); //设置该页的indicator(指示器)设置该Tab页的名字和图标,以及布局 tabSpec.setIndicator(composeLayout("爽哉", R.drawable.coke)) .setContent(R.id.view1); //4将设置好的TabSpec对象添加到TabHost当中 tabHost.addTab(tabSpec); //第二个Tab tabHost.addTab(tabHost.newTabSpec(Tab2).setIndicator(composeLayout("安逸", R.drawable.coke)) .setContent(R.id.view2)); //第三个Tab tabHost.addTab(tabHost.newTabSpec(Tab3).setIndicator(composeLayout("开心", R.drawable.coke)) .setContent(R.id.view3)); //第四个Tab tabHost.addTab(tabHost.newTabSpec(Tab4).setIndicator(composeLayout("说明", R.drawable.coke)) .setContent(R.id.view4)); //setContent(TabContentFactory)可以用一个类来指定其布局的方式,前三个都是用的setContent(int)方式 // CustomLayout custom = new CustomLayout(this); // tabHost.addTab(tabHost.newTabSpec(Tab4).setIndicator("Tab4", getResources() // .getDrawable(R.drawable.icon)) // .setContent(custom)); //*****************************这是对Tab标签本身的设置******************************************* int width =45; int height =48; for(int i = 0; i < tabWidget.getChildCount(); i++) { //设置高度、宽度,不过宽度由于设置为fill_parent,在此对它没效果 tabWidget.getChildAt(i).getLayoutParams().height = height; tabWidget.getChildAt(i).getLayoutParams().width = width; /** * 下面是设置Tab的背景,可以是颜色,背景图片等 */ View v = tabWidget.getChildAt(i); if (tabHost.getCurrentTab() == i) { v.setBackgroundColor(Color.GREEN); //在这里最好自己设置一个图片作为背景更好 //v.setBackgroundDrawable(getResources().getDrawable(R.drawable.chat)); } else { v.setBackgroundColor(Color.GRAY); } } //************************************************************************************ //设置Tab变换时的监听事件 tabHost.setOnTabChangedListener(new OnTabChangeListener() { @Override public void onTabChanged(String tabId) { // TODO Auto-generated method stub //当点击tab选项卡的时候,更改当前的背景 for(int i = 0; i < tabWidget.getChildCount(); i++) { View v = tabWidget.getChildAt(i); if (tabHost.getCurrentTab() == i) { v.setBackgroundColor(Color.GREEN); } else { //这里最后需要和上面的设置保持一致,也可以用图片作为背景最好 v.setBackgroundColor(Color.GRAY); } } } }); } //#################################################################这是设置TabWidget的布局 /** * 这个设置Tab标签本身的布局,需要TextView和ImageView不能重合 * s:是文本显示的内容 * i:是ImageView的图片位置 * 将它设置到setIndicator(composeLayout("开心", R.drawable.coke))中 */ public View composeLayout(String s, int i){ Log.e("Error", "composeLayout"); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); TextView tv = new TextView(this); tv.setGravity(Gravity.CENTER); tv.setSingleLine(true); tv.setText(s); tv.setTextColor(Color.RED); 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; } //################################################################# }
我都有详细的注释,估计大家都能看懂的,有些地方给了提示,扩展的需要就需要自己去完成了
下面是一个两个布局文件
一个是在layout中设置:
<?xml version="1.0" encoding="utf-8"?> <!-- 一个典型的标签Activity 是由2 部分构成的 且其id都有规定 即: * TabWidget 用于展示标签页 id=tabs * FrameLayout 用于展示隶属于各个标签的具体布局 id=tabconten * TabHost 用于整个Tab布局 id=TabHost 还需注意要将Tab显示在最下面就需要这只LinearLayout时用Bottom --> <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/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="需要光临第一个Tab"/> <ImageView android:id="@+id/image1" android:layout_height="wrap_content" android:layout_below="@id/text1" android:layout_width="wrap_content" android:src="@drawable/icon" /> </RelativeLayout> <TextView android:id="@+id/view2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="需要光临第二个Tab"/> <TextView android:id="@+id/view3" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="需要光临第三个Tab"/> <TextView android:id="@+id/view4" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </FrameLayout> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content"> </TabWidget> </LinearLayout> </TabHost>
还有一个在类中设置,设置都差不多,在此类中设置只是针对每个Tab页面的设置
package com.woclub.tabactivitytest; import android.app.Activity; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TabHost; import android.widget.TextView; /** * 此类的功能是设置每个Tab标签的布局方式 * 使用方法 * CustomLayout ct = new CustomLayout(this); * tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(ct)); * @author Administrator * */ public class CustomLayout implements TabHost.TabContentFactory{ private Activity myActivity; private LayoutInflater layoutHelper;//用于实例化布局 private LinearLayout layout; //构造函数,从外面传递参数Activity public CustomLayout(Activity myActivity) { this.myActivity = myActivity; //通过getLayoutInflater从Activity中得到一个实例化的LayoutInflater layoutHelper = myActivity.getLayoutInflater(); } /** * 根据不同的Tab创建不同的视图 */ @Override public View createTabContent(String tag) { // TODO Auto-generated method stub return addCustomView(tag); } /** * 根据Tab的id设置不同Tab的view * 这是普通的设置方式,设置每个Tab的布局 * @param id * @return */ private View addCustomView(String id) { layout = new LinearLayout(myActivity); layout.setOrientation(LinearLayout.HORIZONTAL); if(id.equals("Tab1")) { ImageView iv = new ImageView(myActivity); iv.setImageResource(R.drawable.chat); //设置layout的布局,将一个ImageView添加到其中,并设置ImageView的布局格式,addView的第二个参数是设置ImageView的width和Height layout.addView(iv, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT)); } else if(id.equals("Tab2")) { //第一个控件,注意每添加一个空间都需要用addView添加到layout中 EditText edit = new EditText(myActivity); layout.addView(edit, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); //第二个控件 Button button = new Button(myActivity); button.setText("确定"); button.setWidth(100); layout.addView(button, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); //第三个控件 RadioGroup rGroup = new RadioGroup(myActivity); rGroup.setOrientation(LinearLayout.HORIZONTAL); RadioButton radio1 = new RadioButton(myActivity); radio1.setText("Radio A"); rGroup.addView(radio1); RadioButton radio2 = new RadioButton(myActivity); 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")) { TextView text = new TextView(myActivity); text.setText("the third TextView"); text.setGravity(Gravity.CENTER); layout.addView(text); } else if(id.equals("Tab4")) { LinearLayout.LayoutParams param3 = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); //在这里面又引用了布局文件来设置控件 layout.addView(layoutHelper.inflate(R.layout.hello, null),param3); } return layout; } }
好了,该说的都在代码中说明了
希望大家喜欢,做的粗糙,就由大家去改进吧!
呵呵!
欢迎大家的讨论
发表评论
-
手机游戏的优化
2012-05-14 15:46 1032手机游戏设计中由于设备性能限制,可能出现资源不足的情况 ... -
带进度和时间的播放器
2011-12-19 21:15 2852最近由于需要,做了一个音乐播放控制view,在上面需要能 * ... -
断点续传和下载原理分析
2011-12-07 15:22 14597最近做一个文件上传和下载的应用对文件上传和下载进行了一个完整的 ... -
Android Matrix理论与应用详解
2011-11-21 10:58 17559本文转自http://blog.csdn.net/kuku20 ... -
Android图片处理(Matrix,ColorMatrix)
2011-11-20 22:47 3217在编程中有时候需要对图片做特殊的处理,比如将图片做出黑 ... -
Android事件模型之interceptTouchEvnet ,onTouchEvent关系正解
2011-11-19 20:53 7178参考文档: http://blog.cs ... -
Android下基于XML的 Graphics(转载)
2011-04-23 15:39 1264Android下基于XML的 Graphi ... -
Android之父深入解析Android
2011-04-22 16:10 1007Android之父深入解析Android By: 海 ... -
实现ListView的条目下自动隐藏显示Button的方法
2011-04-17 09:42 6567这个想法是我在看了sina ...
相关推荐
一个简单的TabActivity自定义实现标签换页例子
使用 TabActivity 实现滑动翻页(带动画)和标签置底
Android程序中,Tab标签窗口是一种常用的UI界面元素。它的实现主要是利用了TabHost类。 TabHost说明 TabHost是一个标签窗口的容器。 一个TabHost对象包含两个子元素对象: 一个对象是tab标签集合(TabWidget),用户...
TabActivity实现标签页的功能,通过导航栏对各个页面进行管理。 二.XML布局文件 注意: 1.TabActivity的布局文件要求以TabHost作为XML布局文件的根。 2.通常我们采用线性布局,所以<TabHost> 的子元素是 。 3.对应...
很多客户端软件和浏览器软件都喜欢用Tab分页标签来搭建界面框架。读者也许会马上想到使用TabHost 与 TabActivity的组合,其实最常用的不是它们,而是由GridView与ActivityGroup的组合。每当用户在GridView选中一项,...
ActivityGroup|顶部底部均有Tab标签之二 http://blog.csdn.net/geofferysun/article/details/41852605
最好用的标签实现方法。通过隐藏不需要的Fragment 实现 .直接导入攻城即可使用
Tab选项卡类似与电话本的界面,通过多个标签切换不同的内容,要实现这个效果,首先要知道TabHost,它是一个用来存放多个Tab标签的容器,每一个Tab都可以对应自己的布局,比如,电话本中的Tab布局就是一个线性布局 ...
//设置其标签和图标(setIndicator) //设置内容(setContent) mTabHost.addTab(mTabHost.newTabSpec("test1") .setIndicator("TAB 1",getResources().getDrawable(R.drawable.img1)) .setContent(R.id....
tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("欣赏音乐").setContent(R.id.tab1_layout)); tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("查看日历").setContent(R.id.tab2_layout)); ...
备注:我在继承TabActivity的时候,将TabWidget的android:layout_height设置为"fill_parent"时,tab中不显示任何东西。如图: 如果修改了tabwidget和framelayout的id,系统会报需要相应的标签,这个是在setup方法...
在Android程序中很多客户端软件和浏览器软件都喜欢用Tab分页标签来搭建界面框架。读者也许会马上想到使用TabHost 与 TabActivity的组合,其实最常用的不是它们,而是由GridView与ActivityGroup的组合。每当用户在...
这是一个教你怎么分类标签的教程,用tabActivity实现分页
要实现这一效果,首先要了解TabHost,它是一个用来存放多个Tab标签的容器。每一个Tab都可以对应自己的布局,比如,电话薄中的Tab布局就是一个List的线性布局了。 要使用TabHost,首先需要通过getTabHost方法来获取...
//设置页面为加载中.. progress.showLoading(); //设置适配器 mQuickAdapter = new ListViewAdapter(R.layout.list_view_item_layout,null); //设置加载动画 mQuickAdapter.openLoadAnimation...
Android 实现tab视图有2种方法,一种是在布局页面中定义标签,另一种就是继承tabactivity.但是我比较喜欢第二种方式,应为如果页面比较复杂的话你的XML文件会写得比较庞大,用第二种方式XML页面相对要简洁得多。 下面...