如何在fragmenttabhost使用添加tab后获取Fragment实例

Android -- TabHost、Fragment、状态保存、通信(2) - Android技巧 - 大学IT网
当前位置: >
> Android -- TabHost、Fragment、状态保存、通信
关键词:&&阅读(2593) 赞(15)
[摘要]本文是对Android -- TabHost、Fragment、状态保存、通信的讲解,对学习Android编程技术有所帮助,与大家分享。
有一个id为tab_content的FrameLayout,用来存放要显示的Fragment。底部有一个RadioGroup,用于tab的切换&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/white"
android:orientation="vertical" &
&LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" &
&FrameLayout
android:id="@+id/tab_content"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1.0"
android:background="#" /&
&RadioGroup
android:id="@+id/tabs_rg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:paddingBottom="7dp"
android:paddingTop="7dp" &
&RadioButton
android:id="@+id/tab_rb_a"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:background="@drawable/selector_tab"
android:button="@null"
android:checked="true"
android:drawableTop="@drawable/tablatestalert"
android:gravity="center"
android:singleLine="true"
android:text="Tab1"
android:textColor="#000000"
android:textSize="13sp" /&
&RadioButton
android:id="@+id/tab_rb_b"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:background="@drawable/selector_tab"
android:button="@null"
android:drawableTop="@drawable/tabsearch"
android:gravity="center"
android:singleLine="true"
android:text="Tab2"
android:textColor="#000000"
android:textSize="13sp" /&
&RadioButton
android:id="@+id/tab_rb_c"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:background="@drawable/selector_tab"
android:button="@null"
android:drawableTop="@drawable/tabrecommd"
android:gravity="center"
android:singleLine="true"
android:text="Tab3"
android:textColor="#000000"
android:textSize="13sp" /&
&RadioButton
android:id="@+id/tab_rb_d"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:background="@drawable/selector_tab"
android:button="@null"
android:drawableTop="@drawable/tabconfigicon"
android:gravity="center"
android:singleLine="true"
android:text="Tab4"
android:textColor="#000000"
android:textSize="13sp" /&
&RadioButton
android:id="@+id/tab_rb_e"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:background="@drawable/selector_tab"
android:button="@null"
android:drawableTop="@drawable/tababoutus"
android:gravity="center"
android:singleLine="true"
android:text="Tab5"
android:textColor="#000000"
android:textSize="13sp" /&
&/RadioGroup&
&/LinearLayout&
&/LinearLayout&
现在回到MainActivity中,下面这个FragmentTabAdapter类是关键,是我自己编写的用于绑定和处理fragments和RadioGroup之间的逻辑关系FragmentTabAdapter2 tabAdapter = new FragmentTabAdapter2(this, fragments, R.id.tab_content, rgs);
FragmentTabAdapter2 package com.yydcdut.
import java.util.L
import android.support.v4.app.F
import android.support.v4.app.FragmentA
import android.support.v4.app.FragmentT
import android.widget.RadioG
import android.widget.RadioGroup.OnCheckedChangeL
public class FragmentTabAdapter2 {
private List&Fragment& // 一个tab页面对应一个Fragment
private RadioG // 用于切换tab
private FragmentActivity fragmentA // Fragment所属的Activity
private int fragmentContentId; // Activity中所要被替换的区域的id
private int currentT // 当前Tab页面索引
private OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedL // 用于让调用者在切换tab时候增加新的功能
* 构造函数
* @param fragmentActivity
* @param fragments
* @param fragmentContentId
* @param rgs
public FragmentTabAdapter2(FragmentActivity fragmentActivity,
List&Fragment& fragments, int fragmentContentId, RadioGroup rgs) {
this.fragments =
this.rgs =
this.fragmentActivity = fragmentA
this.fragmentContentId = fragmentContentId;
// 默认显示第一页
FragmentTransaction ft = fragmentActivity.getSupportFragmentManager()
.beginTransaction();
ft.add(fragmentContentId, fragments.get(0));
ft.commit();
// 设置监听事件
MyCheckedChangeListener myCheckedChangeListener = new MyCheckedChangeListener();
rgs.setOnCheckedChangeListener(myCheckedChangeListener);
* 监听器内部类
* @author sansung
class MyCheckedChangeListener implements OnCheckedChangeListener {
public void onCheckedChanged(RadioGroup group, int checkedId) {
for (int i = 0; i & rgs.getChildCount(); i++) {
if (rgs.getChildAt(i).getId() == checkedId) {
Fragment fragment = fragments.get(i);
FragmentTransaction ft = obtainFragmentTransaction(i);
getCurrentFragment().onPause(); // 暂停当前tab
// getCurrentFragment().onStop(); // 暂停当前tab
if (fragment.isAdded()) {
// fragment.onStart(); // 启动目标tab的onStart()
fragment.onResume(); // 启动目标tab的onResume()
ft.add(fragmentContentId, fragment);
showTab(i); // 显示目标tab
ft.commit();
// 如果设置了切换tab额外功能功能接口
if (null != onRgsExtraCheckedChangedListener) {
onRgsExtraCheckedChangedListener
.OnRgsExtraCheckedChanged(group, checkedId, i);
* @param idx
private void showTab(int idx) {
for (int i = 0; i & fragments.size(); i++) {
Fragment fragment = fragments.get(i);
FragmentTransaction ft = obtainFragmentTransaction(idx);
if (idx == i) {
ft.show(fragment);
ft.hide(fragment);
ft.commit();
currentTab = // 更新目标tab为当前tab
* 获取一个带动画的FragmentTransaction
* @param index
private FragmentTransaction obtainFragmentTransaction(int index) {
FragmentTransaction ft = fragmentActivity.getSupportFragmentManager()
.beginTransaction();
// 设置切换动画
if (index & currentTab) {
ft.setCustomAnimations(R.anim.slide_left_in, R.anim.slide_left_out);
ft.setCustomAnimations(R.anim.slide_right_in,
R.anim.slide_right_out);
public int getCurrentTab() {
return currentT
public Fragment getCurrentFragment() {
return fragments.get(currentTab);
public OnRgsExtraCheckedChangedListener getOnRgsExtraCheckedChangedListener() {
return onRgsExtraCheckedChangedL
public void setOnRgsExtraCheckedChangedListener(
OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener) {
this.onRgsExtraCheckedChangedListener = onRgsExtraCheckedChangedL
* 切换tab额外功能功能接口
static class OnRgsExtraCheckedChangedListener {
public void OnRgsExtraCheckedChanged(RadioGroup radioGroup,
int checkedId, int index) {
相关Android技巧推荐技术分享PARTICIPANTS STYLE
您当前的位置: & 技术分享
Android典型界面设计——FragmentTabHost+Fragment实现底部tab切换
&一、问题描述
  在上次博文中,我们使用RadioGroup+ViewPage+Fragmen实现了顶部滑动导航(查看文章:&),接下来我们使用FragmentTabHost+Fragment实现底部tab切换,效果如图所示
&二、案例主要组件
1、MainActivity布局
  把整个Activity分成两部TabHost和TabContent,TabHost包含各个tab,tab之间切换将在TabContent所关联的FrameLayout区域中显示各自板块的内容
复制内容到剪贴板
&&xmlns:android=&/apk/res/android&&&
&&&&xmlns:tools=&/tools&&&
&&&&android:layout_width=&match_parent&&&
&&&&android:layout_height=&match_parent&&&
&&&&android:orientation=&vertical&&&
&&&&tools:context=&.MainActivity&&&&
&&&&&&android:id=&@+id/contentLayout&&&
&&&&&&&&&android:layout_width=&match_parent&&&
&&&&&&&&android:layout_height=&0dp&&&
&&&&&&&&android:layout_weight=&1&&&&
&&&&&&&&&android:id=&@android:id/tabhost&&&
&&&&&&&&&android:layout_width=&match_parent&&&
&&&&&&&&&android:layout_height=&wrap_content&&&
&&&&&&&&&android:background=&#F6F6F6&&&
&&&&&&&&&&&
&&&&&&&&&&android:id=&@android:id/tabcontent&&&
&&&&&&&&&&&&&android:layout_height=&0dp&&android:layout_width=&0dp&&&
&&&&&&&&&&&&&&&
2、MainActivity代码
复制内容到剪贴板
public&class&MainActivity&extends&FragmentActivity&&
&implements&OnTabChangeListener{&&
&&&&private&FragmentTabHost&tabH&&
&&&&@Override&&
&&&&protected&void&onCreate(Bundle&savedInstanceState)&{&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&setContentView(R.layout.activity_main);&&
&&&&&&&&tabHost=(FragmentTabHost)super.findViewById(android.R.id.tabhost);&&
&&&&&&&&tabHost.setup(this,super.getSupportFragmentManager()&&
&&&&&&&&&&&&&&&&,R.id.contentLayout);&&
&&&&&&&&tabHost.getTabWidget().setDividerDrawable(null);&&
&&&&&&&&tabHost.setOnTabChangedListener(this);&&
&&&&&&&&initTab();&&
&&&&private&void&initTab(){&&
&&&&&&&&String&tabs[]=TabDb.getTabsTxt();&&
&&&&&&&&for(int&i=0;i&tabs.i++){&&
&&&&&&&&&&&&TabSpec&tabSpec=tabHost.newTabSpec(tabs[i]).setIndicator(getTabView(i));&&
&&&&&&&&&&&&tabHost.addTab(tabSpec,TabDb.getFragments()[i],null);&&
&&&&&&&&&&&&tabHost.setTag(i);&&
&&&&&&&&}&&
&&&&private&View&getTabView(int&idx){&&
&&&&&&&&View&view=LayoutInflater.from(this).inflate(R.layout.footer_tabs,null);&&
&&&&&&&&((TextView)view.findViewById(R.id.tvTab)).setText(TabDb.getTabsTxt()[idx]);&&
&&&&&&&&if(idx==0){&&
&&&&&&&&&&&&((TextView)view.findViewById(R.id.tvTab)).setTextColor(Color.RED);&&
&&&&((ImageView)view.findViewById(R.id.ivImg)).setImageResource(TabDb.getTabsImgLight()[idx]);&&
&&&&&&&&}else{&&
&&&&&&&&&&&&((ImageView)view.findViewById(R.id.ivImg)).setImageResource(TabDb.getTabsImg()[idx]);&&
&&&&&&&&}&&
&&&&&&&&return&&&
&&&&@Override&&
&&&&public&boolean&onCreateOptionsMenu(Menu&menu)&{&&
&&&&&&&&&&
&&&&&&&&getMenuInflater().inflate(R.menu.main,&menu);&&
&&&&&&&&return&true;&&
&&&&@Override&&
&&&&public&void&onTabChanged(String&tabId)&{&&
&&&&&&&&&&
&&&&&&&&updateTab();&&
&&&&private&void&updateTab(){&&
&&&&&&&&TabWidget&tabw=tabHost.getTabWidget();&&
&&&&&&&&for(int&i=0;i&tabw.getChildCount();i++){&&
&&&&&&&&&&&&View&view=tabw.getChildAt(i);&&
&&&&&&&&&&&&ImageView&iv=(ImageView)view.findViewById(R.id.ivImg);&&
&&&&&&&&&&&&if(i==tabHost.getCurrentTab()){&&
&&&&&&&&&&&&&&&&((TextView)view.findViewById(R.id.tvTab)).setTextColor(Color.RED);&&
&&&&&&&&&&&&&&&&iv.setImageResource(TabDb.getTabsImgLight()[i]);&&
&&&&&&&&&&&&}else{&&&&&&&&((TextView)view.findViewById(R.id.tvTab)).setTextColor(getResources().getColor(R.color.foot_txt_gray));&&
&&&&&&&&&&&&&&&&iv.setImageResource(TabDb.getTabsImg()[i]);&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&
&&&&&&&&}&&
3、TabDb组件
复制内容到剪贴板
public&class&TabDb&{&&
&&&&public&static&String[]&getTabsTxt(){&&
&&&&&&&&String[]&tabs={&新闻&,&阅读&,&试听&,&发现&,&&我&};&&
&&&&&&&&return&&&
&&&&public&static&int[]&getTabsImg(){&&
&&&&&&&&int[]&ids={R.drawable.foot_news_normal,R.drawable.foot_read_normal,R.drawable.foot_vdio_normal,R.drawable.foot_fond_normal,R.drawable.foot_out_normal};&&
&&&&&&&&return&&&
&&&&public&static&int[]&getTabsImgLight(){&&
&&&&&&&&int[]&ids={R.drawable.foot_news_light,R.drawable.foot_read_light,R.drawable.foot_vdio_light,R.drawable.foot_found_light,R.drawable.foot_out_light};&&
&&&&&&&&return&&&
&&&&public&static&Class[]&getFragments(){&&
&&&&&&&&Class[]&clz={NewsFragment.class,ReadFragment.class,VideoFragment.class,FoundFragment.class,OwnerFragment.class};&&
&&&&&&&&return&&&
4、每个tab各自对应的Fragment组件
  共5个Fragment为NewsFragment、ReadFragment、FoundFragment、OwnerFragment、VideoFragment,根据不同板块各自设计界面,这里重点是如何实现底部tab切换,简单布局一下即可,以NewsFragment为例代码如下:
复制内容到剪贴板
public&class&NewsFragment&extends&Fragment&{&&
&&&&@Override&&
&&&&public&void&onAttach(Activity&activity)&{&&
&&&&&&&&&&
&&&&&&&&super.onAttach(activity);&&
&&&&@Override&&
&&&&public&View&onCreateView(LayoutInflater&inflater,&ViewGroup&container,&&
&&&&&&&&&&&&Bundle&savedInstanceState)&{&&
&&&&&&&&&&
&&&&&&&&TextView&tvTitle=new&TextView(super.getActivity());&&
&&&&&&&&tvTitle.setText(&新闻&);&&
&&&&&&&&tvTitle.setLayoutParams(new&LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));&&
&&&&&&&&tvTitle.setGravity(Gravity.CENTER);&&
&&&&&&&&tvTitle.setTextSize(30);&&
&&&&&&&&return&tvT&&
&&&&@Override&&
&&&&public&void&setArguments(Bundle&args)&{&&
&&&&&&&&&&
&&&&&&&&super.setArguments(args);&&
5、tab布局样式(footer_tabs.xml)
复制内容到剪贴板
&version=&1.0&&encoding=&utf-8&&&
&xmlns:android=&/apk/res/android&&&
&&&&android:layout_width=&fill_parent&&&
&&&&android:layout_height=&wrap_content&&&&
&&&&android:gravity=&center&&&
&&&&android:padding=&5dp&&&
&&&&android:background=&#F6F6F6&&&
&&&&&&&&android:id=&@+id/ivImg&&&
&&&&&&&&android:layout_width=&wrap_content&&&
&&&&&&&&android:layout_height=&wrap_content&&&
&&&&&&&&android:layout_alignParentLeft=&true&&&
&&&&&&&&android:layout_alignParentTop=&true&&&
&&&&&&&&android:id=&@+id/tvTab&&&
&&&&&&&&android:layout_width=&wrap_content&&&
&&&&&&&&android:layout_height=&wrap_content&&&
&&&&&&&&android:layout_alignParentLeft=&true&&&
&&&&&&&&android:layout_below=&@+id/ivImg&&&
&&&&&&&&&&android:textColor=&#AEAEAE&&&
&&&&&&&&android:text=&新闻&&android:layout_marginTop=&2dp&&&
  想要了解更多内容的小伙伴,可以点击,亲自运行测试。
  疑问咨询或技术交流,请加入官方QQ群:&()
本文版权归所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。FragmentTabHost&与&Fragment&学习
一直以来大概做带有导航类的应用的时候,都是使用TabActivity,但是,最新的SDK把TabActivity标成了deprecated,那只能重新寻找替代方案了,目前网上说的方案都是很混乱的
Fragment翻译过来叫碎片,但是我个人觉得可以理解为具有生命周期的View
由于Fragment是3.0以后的东西,对于适应低版本,那我们只能使用谷歌官方提供的android-support-v4.jar这个包了,最快捷的办法就是右击工程名,选择Android
Tools——add support library...,即可添加这个包了
由于3.0以下的Activity里面没有对Fragment的支持,所以选择继承android-support-v4.jar包中的FragmentActivity,其功能跟3.0及以后的版本的Activity的功能一样
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/blog/303/a11b5b3ba4cba82a41a.png" ALT="" WIDTH="207" HEIGHT="368" STYLE="border-style: max-width: 100%;"
TITLE="FragmentTabHost&与&Fragment&学习" />
&DEMO下载:
底部导航加顶部导航,使用FragmentTabHost,Fragmetn,FragmentActivity组成,代码已经打包上传了
1、首先,底部导航的实现,FragmentTabHost和以前的TabHost的区别就是增加了对Fragment的支持,这里的实现和其他使用TabActivity是一样的,只是选项卡的切换已经从activity变成fragment了
2、这里主要讲一下顶部导航的实现,为了让大家对fragment更好的理解,这里我没有采用FragmentTabHost,而是放了三个Button
这里有个FragmentTransaction(事务),这个是Fragment切换的核心类,它有两个方法:replace,add,一个是替换Fragment,一个是添加Fragment,两者的区别是:replace=remove掉旧fragment,add新的fragment
FragmentManager(碎片管理器),用来管理当前Activity中所有的Fragment
每次替换或者添加后,都要commit一样,才能算一个完整的事务,这里用了Fragment嵌套,还要注意一个问题,由于我当时没注意,导致想了好久才找出问题的原因所在,如果你是嵌套了Fragment,那么使用FragmentManager的一定要注意你当前的Fragment是属于嵌套的fragment还是顶层的Fragment,如果是顶层Fragment,那么你调用FragmentManager的时候,应该这样写getActivity().getSupportFragmentManager(),如果是嵌套的fragment那么应该这样写getChildFragmentManager()
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。当前访客身份:游客 [
当前位置:
想要用一个BaseFragment类,创建多个tab,然后给每个tab赋予不同的背景,主要部分代码如下:
//定义FragmentTabHost对象
private MyFragmentTabHost mTabH
//定义数组来存放Fragment界面
private Class fragmentArray[] = {BaseFragment.class,BaseFragment.class,BaseFragment.class,BaseFragment.class,BaseFragment.class};
//Tab选项卡的文字
private String mTextviewArray[] = {"a", "b", "c", "d", "e"};
//实例化TabHost对象,得到TabHost
mTabHost = (SunnyFragmentTabHost)findViewById(android.R.id.tabhost);
mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
//得到fragment的个数
int count = fragmentArray.
for(int i = 0; i & i++){
//为每一个Tab按钮设置图标、文字和内容
TabHost.TabSpec tabSpec = mTabHost.newTabSpec(mTextviewArray[i]).setIndicator(getTabItemView(i));
//将Tab按钮添加进Tab选项卡中
mTabHost.addTab(tabSpec, fragmentArray[i], null);
//设置Fragment的背景
BaseFragment bf = (BaseFragment)getSupportFragmentManager().findFragmentByTag(mTextviewArray[i]);
if(bf!=null)
bf.setBackgroundResource(mBgImgs[i]);
其中MyFragmentTabHost参考http://blog.csdn.net/jwzhangjie/article/details/编写,主要是detach和attach部分改为了hide和show
然后在addTab(TabHost.TabSpec tabSpec, Class&?& clss, Bundle args)函数最后增加:
if(info.fragment==null){
info.fragment = Fragment.instantiate(mContext,
info.clss.getName(), info.args);
FragmentTransaction ft = mFragmentManager.beginTransaction();
ft.add(mContainerId, info.fragment, info.tag);
ft.hide(info.fragment);
ft.commit();
但是最开始代码里面addTab后面的
BaseFragment bf = (BaseFragment)getSupportFragmentManager().findFragmentByTag(mTextviewArray[i]);
获取的始终为空,不知如何解决?
同样代码,在mTabHost.setOnTabChangedListener设置的Listener里,可以通过上述代码获得Fragment。
刚开始学Android,可能哪个地方代码没有看到,希望有人能指点,谢谢~
共有3个答案
<span class="a_vote_num" id="a_vote_num_
贴个代码你:private F
在onCreat()中:
final Handler hand = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
f = getSupportFragmentManager().findFragmentByTag("TAG1");//TAG1是--&newTabSpec("TAG1")
Log.e("aaaa", "=====获得的view1是:=====" + f);
new Thread() {
public void run() {
Thread.sleep(1500);//休眠1.5s后就能获取到了
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Message msg = hand.obtainMessage();
hand.sendMessage(msg);
}.start();
<span class="a_vote_num" id="a_vote_num_
最开始打开的时候获取的默认的那个tab总是为空的,需要等上一下才能获取到,但切换到别个tab是可以获取到的
<span class="a_vote_num" id="a_vote_num_
我也被这个问题困扰了,由于fragment是第三方的,我需要在添加到fragmenttabhost之后获取这个实例并且对这个fragment进行设置,但不知道如何获取实例
更多开发者职位上
有什么技术问题吗?
szmneo...的其它问题
类似的话题如何在FragmentTabHost添加tab后获取Fragment实例_百度知道
如何在FragmentTabHost添加tab后获取Fragment实例
提问者采纳
class.class.定义数组来存放Fragment界面 private Class fragmentArray[] = {BaseFragment,BaseFragment.class,BaseFragment.;定义FragmentTabHost对象 private MyFragmentTabHost mTabHTab/ /&#47,BaseF&#47.class};&#47.; &#47,BaseFragment
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 fragmenttabhost用法 的文章

 

随机推荐