Android之TabHost制作
- 格式:doc
- 大小:57.50 KB
- 文档页数:4
Android布局属性大全布局:AbsoluteLayout(绝对布局):xmlns:android="/apk/res/android"style="@..."android:clipChildren="true|false"android:clipToPadding="true|false"android:layoutAnimation="@---"android:animationCache="true|false"android:persistentDrawingCache="none|animation|scrolling|all":持续高速缓存绘图android:alwaysDrawnWithCache="true|false"android:andStatesFromChildre="true|false"android:descendantFocusability="beforeDescendants|afterDescendants|bl ocksDescendants":后裔可聚焦android:id="@+id/absoluteLayout"android:tag="@---"android:android:scrollX="---"android:android:scrollY="---"android:background="@---"android:padding="----"android:paddingLeft="----"android:paddingTop="----"android:paddingRight="----"android:paddingBotton="---"android:focusable="true|false"android:focusableInTouchMode="true|false"android:visibility="visible|invisible|gone"android:fitsSystemWindows="true|false":适合系统窗口android:scrollbars="none|horizontal|vertical"android:scrollbarStyle="insideOverlay(内覆盖)|insideInset(内插图)|outsideOverlay(外覆盖)|outsideInset(外插图)"android:isScrollContainer="true|false":是一个滚动集合android:fadeScrollbars="true|false":褪色的滚动条android:scrollbarFadeDuration="---":卷轴淡出android:scrollDefaultDelayBeforeFade="---":滚动前默认延迟android:scrollbarSize="---"android:scrollbarThumbHorizontal="@----":拇指水平滚动条android:scrollbarThumbVertical="@----":拇指垂直滚动条android:scrollbarTrackVertical="@---":垂直滚动条轨道android:scrollbarTrackHorizontal="@---":水平滚动条轨道android:scrollbarAlwaysDrawHorizontalTrack="true|false":水平滚动条总是吸引轨道android:scrollbarAlwaysDrawVerticalTrack="true|false":垂直滚动条总是吸引轨道android:fadingEdge="none|horizontal|vertical":衰落的边缘android:fadingEdgeLength="---":边长衰落android:nextFocusLeft="----":下左焦点android:nextFocusUp="---":下一个重点注册android:nextFocusRight="---":正确的下一个重点android:nextFocusDown="---":下一个焦点下移android:clickable="true|false":点击android:longClickable="true|false"android:saveEnabled="true|false":启用保存android:drawingCacheQuality="auto|low|hight":绘图缓存质量android:keepScreenOn="true|false":保持屏幕android:duplicateParentState="true|false":重复父状态android:minHeight="---":android:minWidth="----":android:soundEffectEnabled="true|false":音效启用android:hapticFeedbackEnable="true|false":触觉反馈启用android:contentDescription="@---":内容概述android:onClick="@---":android:layout_gravity="top|bottom|right|left|center_vertical|center_ horizontal|fill_vertical|fill_horizontal|center|fill|clip_vertical|cl ip_horizontal":重力android:layout_width="fill_parent|match_parent|wrap_content" android:Llayout_height="fill_parent|match)parent_wrap_content" android:layout_margin="":android:layout_marginLeft=""android:layout_marginTop=""android:layout_marginRight=""android:layout_marginBottom=""DialerFilter(拨号器过滤器):ExpandableListView(可扩展的列表视图):FrameLayout(针布局):GridView(网格视图):HorizontalScrollView(水平滚动查看):ImageSwither(图像切换):LinearLayout(线性布局):ListView(列表视图):MediaController(媒体控制器):RadioGroup(单选按钮组):RelativeLayout(相对布局):ScrollView(滚动查看):SlidingDrawer(滑动抽屉):TabHost(标签主机):TabWidget(标签控件):TableLayout(表格布局):TableRow(表行):TextSwitcher(文字切换):ViewAnimator(查看动画):ViewFlipper(参看弗利珀):ViewSwitcher(查看切换):--------------------------------------------------- GestureOverlayView(手势覆盖查看):SurfaceView(表现观):View(参看):ViewStub(查看存根):WebView(WEB视图):AnalogClock(模拟时钟):AutoCompleteTextView(自动完成文本视图):Button(按钮):CheckBox(复选框):CheckedTextView(检查的文字查看):Chronometer(时计):DatePicker(日期选择器):DigitalClock(数字时钟):EditText(编辑文字):Gallery(画廊):ImageButton(图像按钮):ImageView(图像查看):MultiAutoCompleteTextView(多自动完成文本查看): ProgressBar(进度):QuickContactBadge(快速联系徽章):Radio Button(单选按钮):RatingBar(评分酒吧):SeekBar(搜索栏:即拖拉进度条):Spinner(微调):TextView(文本视图):TimePicker(时间选择器):ToggleButton(切换按钮):TwoLineListItem(两线列表项):VideoView(视频查看):ZoomButton(变焦按钮):ZoomControls(缩放控制):Include(包括):-------------------------------<merge></merge>(合并):xmlns:android="/apk/res/android"android:layout_gravity="top|bottom|left|right|center_vertical|fill_ve rtical|center_horizontal|fill_horizontal|center|fill|clip_vertical|cl ip_horizontal"android:layout_width="fill_parent|match_parent|wrap_content" android:layout_height="fill_parent|match_parent|wrap_content" android:layout_margin=""android:layout_marginLef=""android:layout_marginTop=""android:layout_marginRight=""android:layout_marginBottom=""第一类:属性值为true或falseandroid:layout_centerHrizontal 水平居中android:layout_centerVertical 垂直居中android:layout_centerInparent 相对于父元素完全居中android:layout_alignParentBottom 贴紧父元素的下边缘android:layout_alignParentLeft 贴紧父元素的左边缘android:layout_alignParentRight 贴紧父元素的右边缘android:layout_alignParentTop 贴紧父元素的上边缘android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物第二类:属性值必须为id的引用名“@id/id-name”android:layout_below 在某元素的下方android:layout_above 在某元素的的上方android:layout_toLeftOf 在某元素的左边android:layout_toRightOf 在某元素的右边android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐第三类:属性值为具体的像素值,如30dip,40pxandroid:layout_marginBottom 离某元素底边缘的距离android:layout_marginLeft 离某元素左边缘的距离android:layout_marginRight 离某元素右边缘的距离android:layout_marginTop 离某元素上边缘的距离EditText的android:hint 设置EditText为空时输入框内的提示信息。
实验四TabHost的应用与多语言版本
目录
一TabHost的应用 (2)
1.1 运行界面展示 (2)
1.2 准备工作 (2)
1.3 Java代码部分 (6)
二多语言和国际化开发 (7)
2.1 软件国际化 (7)
2.2 Android项目国际化的实现 (7)
一TabHost的应用
如上图所示,TabHost组件可以实现2款不同风格的分页切换样式。
TabHost可以实现多个界面互相切换。
当前我们以3个界面互相切换为例。
c)最开始是只有一行内容的,是关于最早的MainActivity对应的注册。
点击Add按钮,
e)选中新建的内容,此时右边会有该行内容的细节信息。
如下图所示,点击Name那
f)以同样的方式注册另外几个新建文件。
二多语言和国际化开发
此时在最右边的下拉菜单中找到你需要制作的第二语言。
这里以中文为例,zh。
Finish完成新建工作。
此时会在res中多出来一个value-zh
有新建的string.xml文件。
Android中实现多Tab页应用Android上的多Tab是一个什么效果?如果图片看不懂的话,但是使用过Android的微博客户端,那也很清晰了,就是那个样子。
在Android API V4版本以前,可以使用TabActivity来实现多Tab的应用程序 。
从里面的讲解可以看到,这个教程还是相对简单的。
但是在Android API V4版本之后,TabActivity被废弃了不推荐使用,被替换为Fragment, FragmentActivity了,使用新的API后,开发难度提升了不少,其官方教程: 也没有一个完整的示例。
实现思路,这个一定要看。
1. 实现一个Activity extends FragmentActivity。
2. 实现一个Tab页切换的管理类,监听Tab页切换事件,负责控制Fragment显示其内容。
3. 通过TabInfo类实现Tab与Fragment以及Activity之间的关联。
下面是代码实现,就不一一讲解了,感兴趣的同学同学,在评论中讨论。
import java.util.HashMap;import android.content.Context;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentTransaction;import youtInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TabHost;import android.widget.TabHost.OnTabChangeListener;import android.widget.TabHost.TabContentFactory;import android.widget.TabHost.TabSpec;public class MultiTabActivity extends FragmentActivity {private TabHost tabHost = null;private TabManager tabManager = null;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(yout.activity_frame);tabHost = (TabHost)findViewById(android.R.id.tabhost);tabHost.setup();//Initialize the tabsthis.tabManager = new TabManager(this, this.tabHost, android.R.id.tabcontent); Bundle args = new Bundle();TabSpec tabspec;//first frameargs.putInt(“layoutResource”, yout.test_frame);tabspec = this.tabHost.newTabSpec(“Tab1”);tabspec.setIndicator(“Tab1”);this.tabManager.addTab(tabspec, TabFragment.class, args);//second frameargs = new Bundle();args.putInt(“layoutResource”, yout.test_frame2);tabspec = this.tabHost.newTabSpec(“Tab2”);tabspec.setIndicator(“Tab2”);this.tabManager.addTab(tabspec, TabFragment.class, args);//set current tab is not existif (savedInstanceState != null){this.tabHost.setCurrentTab(savedInstanceState.getInt(“tab”));}else{this.tabHost.setCurrentTab(0);}}@Overrideprotected void onSaveInstanceState(Bundle outState){super.onSaveInstanceState(outState);outState.putString(“tab”, this.tabHost.getCurrentTabTag());}/*** helper class* @author**/public static class TabManager implements OnTabChangeListener{private FragmentActivity activity = null;private TabHost tabhost = null;private int containerId = 0;private final HashMap<String, TabInfo> tabInfoMap = new HashMap<String, TabInfo>(); private TabInfo currentTab = null;/*** TabInfo including tab tag, tab class, tab arguments, tab fragment* @author**/static final class TabInfo{private final String tag;private final Class<?> klass;private final Bundle args;private Fragment fragment = null;TabInfo(String tag, Class<?> klass, Bundle args){this.tag = tag;this.klass = klass;this.args = args;}}/*** A dummy tab by default, later it will replace by fragment* @author**/static class DummyTabFactory implements TabContentFactory{private Context context;DummyTabFactory(Context context){this.context = context;}public View createTabContent(String tag) {View view = new View(this.context);view.setMinimumHeight(0);view.setMinimumWidth(0);return view;}}public TabManager(FragmentActivity activity, TabHost tabhost, int containerId){this.activity = activity;this.tabhost = tabhost;this.containerId = containerId;this.tabhost.setOnTabChangedListener(this);}public void addTab(TabSpec tabspec, Class<?> klass, Bundle args){tabspec.setContent(new DummyTabFactory(this.activity));String tag = tabspec.getTag();TabInfo tabInfo = new TabInfo(tag, klass, args);//check is the tab already exist. If so deactivate it bcoz the initiate state is not show. tabInfo.fragment = this.activity.getSupportFragmentManager().findFragmentByTag(tag); if (tabInfo.fragment != null && !tabInfo.fragment.isDetached()){ FragmentTransaction transaction =this.activity.getSupportFragmentManager().beginTransaction();transaction.detach(tabInfo.fragment) mit();}this.tabInfoMap.put(tag, tabInfo);this.tabhost.addTab(tabspec);}public void onTabChanged(String tag) {TabInfo newTab = this.tabInfoMap.get(tag);if (this.currentTab == newTab){return;}FragmentTransaction transaction =this.activity.getSupportFragmentManager().beginTransaction();//detach current tabif (this.currentTab != null && this.currentTab.fragment != null ){ transaction.detach(this.currentTab.fragment);}if (newTab != null){if (newTab.fragment == null){newTab.fragment = Fragment.instantiate(this.activity, newTab.klass.getName(), newTab.args);transaction.add(this.containerId, newTab.fragment, newTab.tag);}else{transaction.attach(newTab.fragment);}}this.currentTab = newTab;transaction mit();this.activity.getSupportFragmentManager().executePendingTransactions();}}/*** The Tab Fragment* @author**/public static class TabFragment extends Fragment{private int layoutResource;/*** this method will be called when call Fragment.* @param resource* @return*/static TabFragment newInstance(int resource){TabFragment fragment = new TabFragment();Bundle args = new Bundle();args.putInt(“layoutResource”, resource);fragment.setArguments(args);return fragment;}public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);Bundle args = this.getArguments();layoutResource = args.getInt(“layoutResource”);}public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){return inflater.inflate(layoutResource, container, false);}}}。
如何使用Android Studio进行布局设计和界面编写Android Studio是一款专门用于Android应用开发的集成开发环境(IDE),它提供了许多强大的工具和功能,使开发者可以更轻松地设计应用程序的布局和界面。
本文将介绍如何使用Android Studio进行布局设计和界面编写的步骤和技巧。
一、创建新的布局文件在Android Studio中,可以使用XML文件来定义应用程序的布局。
首先,我们需要创建一个新的布局文件。
在项目视图中,右键单击“res”文件夹,选择“New” -> “Android resource file”。
在弹出的对话框中,填写文件名和文件类型(在这里我们选择“layout”类型),然后点击确定。
二、使用布局编辑器进行设计创建好布局文件后,我们可以使用布局编辑器来设计应用程序的界面。
点击“Design”选项卡,即可进入布局编辑模式。
接下来,我们将介绍布局编辑器中的一些常用功能。
1. 布局容器布局容器用于定义和管理界面上的视图组件的排列方式。
Android Studio提供了各种类型的布局容器,如线性布局(LinearLayout)、相对布局(RelativeLayout)和帧布局(FrameLayout)等。
通过拖拽和调整组件的位置和大小,我们可以在布局容器中创建所需的布局结构。
2. 视图组件视图组件是应用程序界面的基本单元,如按钮、文本框和图片等。
在布局编辑器中,我们可以从左侧的“Palette”面板中选择不同类型的视图组件,并在布局容器中进行布局设置。
3. 属性面板属性面板用于编辑和设置视图组件的属性。
在布局编辑器中,选中一个视图组件后,右侧的属性面板将显示该组件的属性列表。
我们可以通过修改属性值,调整组件的外观和行为。
三、编写界面逻辑和事件处理设计好界面的布局后,我们需要为视图组件添加逻辑和事件处理。
在Android Studio中,可以通过编写Java代码来实现这些功能。
AndroidTabLayout(选项卡布局)简单⽤法实例分析本⽂实例讲述了Android TabLayout(选项卡布局)简单⽤法。
分享给⼤家供⼤家参考,具体如下:我们在应⽤viewpager的时候,经常会使⽤TabPageIndicator来与其配合。
达到很漂亮的效果。
但是TabPageIndicator是第三⽅的,⽽且⽐较⽼了,当然了现在很多⼤神都已经开始⾃⼰写TabPageIndicator来满⾜⾃⼰的需求,在2015年的google⼤会上,google发布了新的Android Support Design库,⾥⾯包含了⼏个新的控件,其中就有⼀个TabLayout,它就可以完成TabPageIndicator的效果,⽽且还是官⽅的,最好的是它可以兼容到2.2以上版本,包括2.2。
下⾯我就举⼀个简单的例⼦来使⽤它。
这⾥使⽤的 android studio进⾏开发的,所以引⽤TabLayout很简单,只要在build.gradle中加⼊compile'com.android.support:design:22.2.0'即可。
这个使⽤是我在仿知乎的时候使⽤。
所以页⾯就和知乎很像了fragment_find.xml<LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:app="/apk/res-auto"android:orientation="vertical"><android.support.design.widget.TabLayoutandroid:id="@+id/tab_FindFragment_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/titleBlue"app:tabIndicatorColor="@color/white"app:tabSelectedTextColor="@color/gray"app:tabTextColor="@color/white"/><android.support.v4.view.ViewPagerandroid:id="@+id/vp_FindFragment_pager"android:layout_width="fill_parent"android:layout_height="0dp"android:layout_weight="1"/></LinearLayout>这⾥⾯没有什么特别的,就是添加了⼀个TabLayout和Viewpager作为上下的布局。
4.3.2 建表语句1)创建:1、创建书的表:create table IF NOT EXISTS book(bid integer primary key autoincrement,bpath varchar(255) not null);2、创建书签的表:create table IF NOT EXISTS bookmark(bmid integer primary key autoincrement, bpath varchar(50) not null,bmname varchar(50) not null,bmoffset integer not null,bmsavetime varchar(20) not null);3、创建用户管理的表:create table IF NOT EXISTS user(userid integer primary key autoincrement, username varchar(20) not null,password varchar(20) not null, telephone varchar(20) not null);4、创建最近阅读的表create table IF NOT EXISTS nearlyread(bookid integer primary key autoincrement, bookname varchar(50) not null,bookreadtime varchar(20) not null); 5、创建下载管理的表create table IF NOT EXISTS down(downid integer primary key autoincrement, downuser varchar(20) not null,downbook varchar(20) not null, downtime varchar(20) not null);2)SQlite3数据库使用方法:选择:select from bookmark where bmid=1;插入:insert (bookmark,null,values);删除:delete from bookmark where bmid=3 ;查找:query(table, columns, selection, selectionArgs, groupBy, having, orderBy) 4.3.3 数据表分析本数据库用的是一个轻量级嵌入型数据库sqlite3 ,即创建了一个数据库reader.db,在数据库中创建了几张数据表。
android开发技巧总汇android开发培训-教师必备名目<<android 的几个技巧1>> 错误!未定义书签。
1. 入门实例剖析1 22.在测试时,如何实现一个提示113.能够使用AlertDialog.Builder 才产生一个提示框. 114. menu 的用法. 131. 简单的代码132. menu实现的两种方法145.Activity 的切换(含Bundle传值)141. 代码142. 详解: 166.Android UI Layout 197. Tab以及HostTab操作208. List (图片/按钮/标题/文本) 25LIST例一 25LIST例二 37LIST例三 429. 调用扫瞄器载入某网址 4610.监控应用程序包的安装&删除46方法一: 46方法二: 5111. 使用Toast输出一个字符串 5912. 把一个字符串写进文件 5913. 把文件内容读出到一个字符串 6114. 调用Android installer 安装和卸载程序6315. 终止某个进程6416. 设置默认来电铃声6417. 开机自启动6618. 线程与子线程67handlerMessage实例 6819. Service 711. 什么是Service712. 如何使用Service 713. Service的生命周期80附) 常用界面截图: 81提示1 81提示2 81菜单811. 入门实例剖析1开卷语俗语讲,“熟读唐诗三百首,可不能作诗也会吟”。
最近收集了专门多A ndroid的示例代码,从这些代码的阅读和实验中学习到专门多知识,从而产生写那个系列的打算,目标确实是一步步跟着实例进行动手实作,真正从“做”中体会和学习Android开发。
本文目标是Android自带的一个范例程序:记事本,预备知识搭建开发环境,尝试编写”Hello World”,了解Android的差不多概念,熟悉Android的API(官方文档中都有,不赘述)。
本android帮助文档为在学习视频时自己制作比较混乱和粗糙,使用时查找第一页导航,再用word的查找功能进行查找导航页——基础说明——监听器的设置->创建监听器——调用android自带的短信发送功能——Activity的方法和生命周期(创建对话框风格的)——Activity的布局方法--LinearLayout线性--常用标签--TableLayout表格--GridView滑动表格--RelativeLayout相对布局——常用控件--除去title和全屏显示--EditText可输入文本框--RadioGroup和RadioButton单选按钮--Toast提示框--CheckBox多选按钮--ProgressBar进度条--ListView可选列表--MENU菜单控件的使用--Animation动画效果--4种动画效果--动画实现--JAVA中的实现--XMl文件中的实现-- Gallery (走马灯式的)移动选择控件--ImageSwitcher图片显示控件--ImageButton图片按钮控件--AlertDialog提示框——Handler的使用---线程--handler的简单应用--用handler更新ProgressBar进度条--handler与线程--线程之间的数据传递--Bundle对象(大量复杂数据) --Message对象(少量简单)--建立一个新的线程--HandlerThread类——SQLite的使用--SQLiteOpenHelper的方法注:带有下划线的是一些封装--代码的编写的可以直接调用的类,在”帮助文档的链接文件\封装的类”文件--封装的DatabaseHelper类夹中都有保存可以直接导入调用--主java文件--命令行的查询方法——文件下载--文件下载--步骤--在注册文件中注册权限--封装的HttpDownLoad类--在Activity中的调用--访问SDCARD --注册权限--封装的FileUtils类--在Activity文件中的调用——_XML文件的解析--SAX常用接口--XMl文件解析实例--实现ContentHandler接口的类--在Activity中的调用 XMl文件实例aaa.xml——广播机制--android中的广播机制--编写BroadcastReveicer类--创建包含BroadcastReveicer类的java文件--在onReceive中处理收到短消息的事件--AndroidManifest.XML注册文件中注册--代码当中进行注册--Activity中发送广播——WIFI--WIFI网卡的状态--操作WIFI网卡所需要的部分权限--改变WIFI网卡的状态——Socket编程--使用基于TCP协议的Socket--使用基于UDP协议的Socket——ServiceAndroid创建基础:src文件中为包类,其中用于建立activity的java文件res中drawable中为图片和标签layout中为布局文件,用于每个activity.java文件的标签布局AndroidManifest中为注册文件,每一个activity的建立都需要在其中注册代码的编写intent对象(用于在不同activity转换时的监听器设置)ponent name 指定activity2.Action 指定activity的作用3.Data 传送的数据类型4.Extras (额外)传送的键值对创建监听器的关键代码:(在第一个activity中)//创建一个Button监听器class myButtonListener implements OnClickListener{public void onClick(View v) {// TODO Auto-generated method stub//创建一个intent类Intent intent = new Intent();//创建一个键值对intent.putExtra("nexttext", "跳转成功");//创建关联intent.setClass(FirstActivity.this, SecondActivity.class);FirstActivity.this.startActivity(intent);}}在第一个activity中的转换关键标签上绑定监听器:(例在Button标签)(在onCreate中)//在Button上绑定监听器myButton.setOnClickListener(new myButtonListener());在第二个activity中的应用键值对(数据传递):(在onCreate中)//获取键值对Intent intent = getIntent();//获得键值对的值String text = intent.getStringExtra("nexttext");在Activity中调用android自带的短信发送功能的关键代码://调用短信发送功能class myButtonListener implements OnClickListener{public void onClick(View v) {// TODO Auto-generated method stub//发送号码Uri uri = Uri.parse("smsto://0800000123");Intent it = new Intent(Intent.ACTION_SENDTO,uri);//发送内容it.putExtra("sms_body", "the SMS text");startActivity(it);}}Activity的方法和生命周期:--onCreate 一个activity启动时运行(第一次)--onStart 当activity处于可见状态时运行--onResume 当activity可以得到用户焦点时(可以被操作)运行--onPause 当activity处于暂停状态时(例如弹出其他activity而原activity未被完全覆盖),可在此保存数据,以便此activity释放时恢复原状--onStop 当activity完全不可见时--onRestart 当activity未被销毁而在此被调用时--onDestory 当activity被销毁时当调用finish();语句时,Activity被销毁。
FragmentTabHost与fragment的使⽤(设置标题)有别与前⾯的是这个标题不会滚动import android.os.Bundle;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentTabHost;import android.widget.TabHost.TabSpec;public class MainActivity extends FragmentActivity {private FragmentTabHost tabHost;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);// 获得tabhosttabHost = (FragmentTabHost) findViewById(R.id.fth_tabHost);// 关联fragment的容器id和fragmentmanger// Context context,// FragmentManager manager,//管理fragment的fragmentmanger// int containerId //存放fragment的容器tabHost.setup(MainActivity.this, getSupportFragmentManager(),R.id.fl_fragment);for (int i = 0; i < 3; i++) {TabSpec tabSpec = tabHost.newTabSpec("收藏" + i).setIndicator("收藏" + i);// 将要显⽰的fragment与tabhost关联// TabSpec tabSpec,// Class<?> clss, 传⼊Fragment的class对象// Bundle args 传⼊fragment中的bundle参数, 相当于 setArguments();Bundle bundle = new Bundle();bundle.putInt("INDEX", i);tabHost.addTab(tabSpec, FragmentOne.class, bundle);}}}碎⽚类 FragmentOne.javaimport java.util.ArrayList;import java.util.List;import android.content.Context;import android.os.Bundle;import android.support.v4.app.Fragment;import youtInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;public class FragmentOne extends Fragment {private List<List<Person>> dataList;private List<Person> list;private Context context;private LayoutInflater inflater;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);initData();}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {this.context = getActivity();this.inflater = inflater;View view = inflater.inflate(yout.fragment_one, null);ListView lvItems = (ListView) view.findViewById(R.id.lv_items);// 获得activity传⼊的参数,根据参数再请求⽹络数据Bundle bundle = getArguments();int pagerIndex = bundle.getInt("INDEX");list = dataList.get(pagerIndex);lvItems.setAdapter(new ItemBaseAdapter());return view;}//模拟数据private void initData() {dataList = new ArrayList<List<Person>>();for (int i = 0; i < 3; i++) {ArrayList<Person> arrayList = new ArrayList<Person>();for (int j = 0; j < 30; j++) {arrayList.add(new Person(i + "王宝强" + j, "1378273" + j));}dataList.add(arrayList);}}class ItemBaseAdapter extends BaseAdapter {@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) { View view = inflater.inflate(yout.listview_item, null);TextView tvName = (TextView) view.findViewById(_name);TextView tvNumber = (TextView) view.findViewById(_number); Person person = list.get(position);tvName.setText(person.getName());tvNumber.setText(person.getNumber());return view;}}}Person.java为listview的item数据实体类activity_main.xml<RelativeLayout xmlns:android="/apk/res/android" xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"><android.support.v4.app.FragmentTabHostandroid:id="@+id/fth_tabHost"android:layout_width="match_parent"android:layout_height="wrap_content"></android.support.v4.app.FragmentTabHost><FrameLayoutandroid:id="@+id/fl_fragment"android:layout_width="match_parent"android:layout_height="match_parent"></FrameLayout></RelativeLayout>碎⽚显⽰的布局⽂件fragment_one.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android" android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ListViewandroid:id="@+id/lv_items"android:layout_width="match_parent"android:layout_height="match_parent"></ListView></LinearLayout>listview_item.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android" android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/tv_name"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/tv_number"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#ff3333"/></LinearLayout>效果:。
通常情况下,我们都会采用想要android.app.TabActivity、android.widget.TabHost、youtInflater、android.widget.TabWidget和android.widget.FrameLayout这几个组件来完成Tab相互切换的界面。
本文将利用其中三种方式来制作Tab相互切换的界面。
效果图和示例代码:
1.主界面
activity_main.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<RelativeLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lstv_demos"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
MainActivity.java
1
2
3
4
5
6
7
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
53
54
55
56
57
58
59
60
61
62
63
64
package com.panny.tabsdemo;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
private ListView lstvDemos;
private String[] contents = new String[]{
"Content By Id",
"Content By Factory",
"Content By Intent",
"Scrollable"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(youtParams.FLAG_FULLSCREEN, youtParams.FLAG_FULLSCREEN);
setContentView(yout.activity_main);
this.lstvDemos = (ListView) findViewById(R.id.lstv_demos);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
getCurrentContext(),
yout.simple_list_item_1,
contents);
this.lstvDemos.setAdapter(adapter);
this.lstvDemos.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
switch (position) {
case 0:
startActivity(new Intent(getCurrentContext(), ContentByIdActivity.class));
break;
case 1:
startActivity(new Intent(getCurrentContext(), TabByContentFactoryActivity.class));
break;
case 2:
startActivity(new Intent(getCurrentContext(), TabByIntentActivity.class));
break;。