如何获得内容片段在onTabChanged(字符串tabTag) [英] how to get the content fragment at onTabChanged(String tabTag)

查看:334
本文介绍了如何获得内容片段在onTabChanged(字符串tabTag)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

搜索,看到了类似的问题,几个帖子,但没有有效的解决方案。
张贴在这里,看看是否有人已经解决了。

有FragmentTabHost的片段,并试图获取当前选项卡的内容片段。

在mTabHost.setOnTabChangedListener的onTabChanged(字符串tabTag)
在frgmt = getChildFragmentManager()findFragmentByTag(tabTag)。返回null。

  mTab​​Host.setOnTabChangedListener(新TabHost.OnTabChangeListener(){
        @覆盖
        公共无效onTabChanged(字符串tabTag){            片段frgmt = getChildFragmentManager()findFragmentByTag(tabTag)。        }
    });

在FragmentTabHost,其onTabChanged()调用doTabChanged(),其实例化内容片段,并添加与FragmentTransaction,或者如果该片段存在附加到它。

我想,当FragmentTabHost :: onTabChanged()调用到听者的onTabChanged(),该片段是仍然getChildFragmentManager()在FragmentManager没有准备好。

有没有办法从FragmentTabHost的获得mLastTab?它应该有目前的内容片段。

感谢您的帮助!

  @覆盖
公共无效onTabChanged(字符串tabId){
    如果(mAttached){
        FragmentTransaction英尺= doTabChanged(tabId,NULL);
        如果(英尺!= NULL){
            ft.commit();
        }
    }
    如果(mOnTabChangeListener!= NULL){
        mOnTabChangeListener.onTabChanged(tabId);
    }
}私人FragmentTransaction doTabChanged(字符串tabId,FragmentTransaction英尺){
    TabInfo newTab = NULL;
    的for(int i = 0; I< mTab​​s.size();我++){
        TabInfo标签= mTab​​s.get(I)
        如果(tab.tag.equals(tabId)){
            newTab =标签;
        }
    }
    如果(newTab == NULL){
        抛出新IllegalStateException异常(无标签闻名标签+ tabId);
    }
    如果(mLastTab!= newTab){
        如果(英尺== NULL){
            英尺= mFragmentManager.beginTransaction();
        }
        如果(mLastTab!= NULL){
            如果(mLastTab.fragment!= NULL){
                ft.detach(mLastTab.fragment);
            }
        }
        如果(newTab!= NULL){
            如果(newTab.fragment == NULL){
                newTab.fragment = Fragment.instantiate(mContext,
                        newTab.clss.getName(),newTab.args);
                ft.add(mContainerId,newTab.fragment,newTab.tag);
            }其他{
                ft.attach(newTab.fragment);
            }
        }        mLastTab = newTab;
    }
    返回英尺;
}


解决方案

你可以在OntabChanged(看到的是ft.commit问题),然后我们称之为

 如果(mOnTabChangeListener!= NULL){
    mOnTabChangeListener.onTabChanged(tabId);
}

仍然没有因此创建标签片段,当我们试图让OnTabChnaged回调里面Tabfragement实例抛出空指针异常。

我的解决方案:
我们应该用这样两个片段之间通过活动交流。

下面是活动

 公共类MainActivity扩展ActionBarActivity实现OnHeadlineSelectedListener {@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);
}
@覆盖
公共布尔onCreateOptionsMenu(菜单菜单){
    //充气菜单;如果是present这增加了项目操作栏。
    。getMenuInflater()膨胀(R.menu.menu_main,菜单);
    返回true;
}@覆盖
公共布尔onOptionsItemSelected(菜单项项){
    //处理动作栏项目点击这里。操作栏会
    //自动处理上点击主页/向上按钮,只要
    //你在AndroidManifest.xml中指定一个父活动。
    INT ID = item.getItemId();    // noinspection SimplifiableIfStatement
    如果(ID == R.id.action_settings){
        返回true;
    }    返回super.onOptionsItemSelected(项目);
}@覆盖
公共无效OnTabCompletelyChanged(字符串标签){
    ((MainActivityFragment)getSupportFragmentManager().findFragmentById(R.id.fragment)).OnTabChanged(tag);}

}

MainFragment抓住引片

 公共类MainActivityFragment扩展片段{
私人FragmentTabHost mTab​​Host;
私人FragmentTab标签;
公共MainActivityFragment(){
}@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                         捆绑savedInstanceState){
    视图V = inflater.inflate(R.layout.fragment_main,集装箱,FALSE);    mTabHost =(FragmentTabHost)v.findViewById(android.R.id.tabhost);
    mTabHost.setup(getActivity(),getChildFragmentManager(),android.R.id.tabcontent);    mTabHost.addTab(
            mTabHost.newTabSpec(TAB1)。setIndicator(标签1,NULL)
            FragmentTab.class,NULL);
    mTabHost.addTab(
            mTabHost.newTabSpec(TAB2)。setIndicator(表2,NULL)
            FragmentTab.class,NULL);
    mTabHost.addTab(
            mTabHost.newTabSpec(TAB3)。setIndicator(标签3,NULL)
            FragmentTab.class,NULL);    返回伏;
}
公共无效OnTabChanged(字符串标签){
    标签=(FragmentTab)getChildFragmentManager()findFragmentByTag(标签)。 //非空
}

}

FragmentTab:

 公共类FragmentTab扩展片段{私人OnHeadlineSelectedListener mCallback;@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
}@覆盖
公共无效onAttach(活动活动){
    super.onAttach(活动);    //这将确保集装箱活动实施
    //回调接口。如果不是,它抛出一个异常
    尝试{
        mCallback =(OnHeadlineSelectedListener)活性;
    }赶上(抛出ClassCastException E){
        抛出新ClassCastException异常(activity.toString()
                +必须实现OnHeadlineSelectedListener);
    }
}@覆盖
公共无效调用onStart(){
    super.onStart();
    mCallback.OnTabCompletelyChanged(this.getTag());
}公共字符串的getString(){
    返回你好;
}
@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                         捆绑savedInstanceState){
    视图V = inflater.inflate(R.layout.fragment_layout,集装箱,FALSE);
    TextView的电视=(TextView中)v.findViewById(R.id.text);
    tv.setText(this.getTag()+内容);
    返回伏;
}}

Searched and saw a few posts for the similar question, but no working solution. Post here to see if someone have solved it.

Having FragmentTabHost in a fragment, and trying to get current tab's content fragment.

in mTabHost.setOnTabChangedListener's onTabChanged(String tabTag) the frgmt = getChildFragmentManager().findFragmentByTag(tabTag); returns null.

mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
        @Override
        public void onTabChanged(String tabTag) {

            Fragment frgmt = getChildFragmentManager().findFragmentByTag(tabTag);

        }
    });

In FragmentTabHost, its onTabChanged() calls doTabChanged() which instantiates the content fragment and add with FragmentTransaction, or attach to it if the fragment exist.

I guess when FragmentTabHost::onTabChanged() calls into the listener's onTabChanged(), the fragment is still not ready in the FragmentManager by getChildFragmentManager().

Is there a way the get the mLastTab from the FragmentTabHost? It should have the current content fragment.

Thanks for the help!

@Override
public void onTabChanged(String tabId) {
    if (mAttached) {
        FragmentTransaction ft = doTabChanged(tabId, null);
        if (ft != null) {
            ft.commit();
        }
    }
    if (mOnTabChangeListener != null) {
        mOnTabChangeListener.onTabChanged(tabId);
    }
}

private FragmentTransaction doTabChanged(String tabId, FragmentTransaction ft) {
    TabInfo newTab = null;
    for (int i=0; i<mTabs.size(); i++) {
        TabInfo tab = mTabs.get(i);
        if (tab.tag.equals(tabId)) {
            newTab = tab;
        }
    }
    if (newTab == null) {
        throw new IllegalStateException("No tab known for tag " + tabId);
    }
    if (mLastTab != newTab) {
        if (ft == null) {
            ft = mFragmentManager.beginTransaction();
        }
        if (mLastTab != null) {
            if (mLastTab.fragment != null) {
                ft.detach(mLastTab.fragment);
            }
        }
        if (newTab != null) {
            if (newTab.fragment == null) {
                newTab.fragment = Fragment.instantiate(mContext,
                        newTab.clss.getName(), newTab.args);
                ft.add(mContainerId, newTab.fragment, newTab.tag);
            } else {
                ft.attach(newTab.fragment);
            }
        }

        mLastTab = newTab;
    }
    return ft;
}

解决方案

The problem as you can see is ft.commit in OntabChanged() and then we call

if (mOnTabChangeListener != null) {
    mOnTabChangeListener.onTabChanged(tabId);
}

the tab fragment still not created hence throws null pointer exception when we try to get the instance of Tabfragement inside OnTabChnaged callback.

My Solution : we should use the way two fragments communicate with each other using activity.

Here is the activity

public class MainActivity extends ActionBarActivity implements OnHeadlineSelectedListener{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@Override
public void OnTabCompletelyChanged(String tag) {
    ((MainActivityFragment)getSupportFragmentManager().findFragmentById(R.id.fragment)).OnTabChanged(tag);

}

}

MainFragment Holding the Tabs

public class MainActivityFragment extends Fragment {
private FragmentTabHost mTabHost;
private FragmentTab tab;
public MainActivityFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_main, container, false);

    mTabHost = (FragmentTabHost) v.findViewById(android.R.id.tabhost);
    mTabHost.setup(getActivity(), getChildFragmentManager(), android.R.id.tabcontent);

    mTabHost.addTab(
            mTabHost.newTabSpec("tab1").setIndicator("Tab 1", null),
            FragmentTab.class, null);
    mTabHost.addTab(
            mTabHost.newTabSpec("tab2").setIndicator("Tab 2", null),
            FragmentTab.class, null);
    mTabHost.addTab(
            mTabHost.newTabSpec("tab3").setIndicator("Tab 3", null),
            FragmentTab.class, null);

    return v;
}


public void OnTabChanged(String tag) {
    tab = (FragmentTab)getChildFragmentManager().findFragmentByTag(tag); // Not null
}

}

FragmentTab:

public class FragmentTab extends Fragment {

private OnHeadlineSelectedListener mCallback;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        mCallback = (OnHeadlineSelectedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnHeadlineSelectedListener");
    }
}

@Override
public void onStart() {
    super.onStart();
    mCallback.OnTabCompletelyChanged(this.getTag());
}

public String getString(){
    return "hello";
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_layout, container, false);
    TextView tv = (TextView) v.findViewById(R.id.text);
    tv.setText(this.getTag() + " Content");
    return v;
}}

这篇关于如何获得内容片段在onTabChanged(字符串tabTag)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆