Android 如何在FragmentTabHost中获取当前选定的片段

Android 如何在FragmentTabHost中获取当前选定的片段,android,android-fragments,fragment-tab-host,Android,Android Fragments,Fragment Tab Host,还有一些问题与这个问题有关。例如但它不起作用 让我展示一下我在代码中做了什么 活动\u main.xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" and

还有一些问题与这个问题有关。例如但它不起作用

让我展示一下我在代码中做了什么

活动\u main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container"
    android:layout_width="match_parent" android:layout_height="match_parent"
    tools:context=".MainActivity" tools:ignore="MergeRootFrame" >

    <fragment
        android:id="@+id/my_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.example.zhouhao.test.MyFragment"
        tools:layout="@layout/fragment_my" />

</FrameLayout>
公共类MyFragment扩展片段实现了TabHost.OnTabChangeListener{

FragmentTabHost mFragmentTabHost;


public MyFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_my, container, false);
    if (rootView != null) {
        mFragmentTabHost = (FragmentTabHost) rootView.findViewById(android.R.id.tabhost);
        mFragmentTabHost.setup(getActivity(), getActivity().getSupportFragmentManager(), R.id.panel_content);
        TabFragment1 tab1Fragment = new TabFragment1();
        TabFragment2 tab2Fragment = new TabFragment2();
        TabFragment3 tab3Fragment = new TabFragment3();
        TabHost.TabSpec spec1 = mFragmentTabHost.newTabSpec("1").setIndicator("");
        TabHost.TabSpec spec2 = mFragmentTabHost.newTabSpec("2").setIndicator("");
        TabHost.TabSpec spec3 = mFragmentTabHost.newTabSpec("3").setIndicator("");
        mFragmentTabHost.addTab(spec1,tab1Fragment.getClass(), null);
        mFragmentTabHost.addTab(spec2,tab2Fragment.getClass(), null);
        mFragmentTabHost.addTab(spec3,tab3Fragment.getClass(), null);
        mFragmentTabHost.setOnTabChangedListener(this);
        return rootView;
    } else {
        return super.onCreateView(inflater, container, savedInstanceState);
    }
}

@Override
public void onTabChanged(String tabId) {

    BaseFragment f = (BaseFragment)getActivity().getSupportFragmentManager().findFragmentByTag(tabId);
    Log.d("Log",tabId);
}
}


我的问题是BaseFragment在我的onTabChanged中总是空的。有人能帮忙吗?谢谢。

如果所选片段从未实例化,则无法立即获取该片段

@Override
public void onTabChanged(final String tabId) {
    Fragment fg = getSupportFragmentManager().findFragmentByTag(tabId);
    Log.d(TAG, "onTabChanged(): " + tabId + ", fragment " + fg);

    if (fg == null) {
        new Handler().postDelayed(new Runnable() {            
            @Override
            public void run() {
                Fragment fg = getSupportFragmentManager().findFragmentByTag(tabId);
                Log.d(TAG, "onTabChanged() delay 50ms: " + tabId + ", fragment " + fg);              
            }
        }, 50);
    }
}
输出:

// cannot get the selected fragment immediately if the fragment has never been instantiated.
onTabChanged(): 1, fragment null
onTabChanged() delay 50ms: 1, fragment HistoryFragment{6f7a9d5 #2 id=0x7f09006e 1}
onTabChanged(): 2, fragment null
onTabChanged() delay 50ms: 2, fragment HistoryFragment{10c59e72 #3 id=0x7f09006e 2}

// can get the selected fragment immediately if the fragment already instantiated.
onTabChanged(): 1, fragment HistoryFragment{6f7a9d5 #2 id=0x7f09006e 1}
onTabChanged(): 2, fragment HistoryFragment{10c59e72 #3 id=0x7f09006e 2}

我想我找到了解决这个问题的正确方法,下面是我的答案

  • 创建一个TabBean
  • 然后,获得三个包含三个片段的TabBean实例
  • 第四,这是最重要的一步,我没有像这样使用findFragmentByTag()获取片段实例
  • 相反,我的答案是这样的:

    tabs.get(0).getFragment().newInstance();
    
    然后投下它


    我终于得到了这个片段。

    请看下面的文章。这与我在文章中提到的url完全相同。但它不适合我。我可以在添加Tab时使用HashMap来存储片段。但是该选项卡被添加到FragmentTabHost中,可能有办法将其检索回来。我说的对吗?在活动中添加
    mMyFragment
    的地方也张贴代码,以获取TabFragment1,2,3,。。。首先需要获取
    mMyFragment
    ,然后获取TabFragment1,2,3,。。。碎片
    @Override
    public void onTabChanged(final String tabId) {
        Fragment fg = getSupportFragmentManager().findFragmentByTag(tabId);
        Log.d(TAG, "onTabChanged(): " + tabId + ", fragment " + fg);
    
        if (fg == null) {
            new Handler().postDelayed(new Runnable() {            
                @Override
                public void run() {
                    Fragment fg = getSupportFragmentManager().findFragmentByTag(tabId);
                    Log.d(TAG, "onTabChanged() delay 50ms: " + tabId + ", fragment " + fg);              
                }
            }, 50);
        }
    }
    
    // cannot get the selected fragment immediately if the fragment has never been instantiated.
    onTabChanged(): 1, fragment null
    onTabChanged() delay 50ms: 1, fragment HistoryFragment{6f7a9d5 #2 id=0x7f09006e 1}
    onTabChanged(): 2, fragment null
    onTabChanged() delay 50ms: 2, fragment HistoryFragment{10c59e72 #3 id=0x7f09006e 2}
    
    // can get the selected fragment immediately if the fragment already instantiated.
    onTabChanged(): 1, fragment HistoryFragment{6f7a9d5 #2 id=0x7f09006e 1}
    onTabChanged(): 2, fragment HistoryFragment{10c59e72 #3 id=0x7f09006e 2}
    
    private int imgId;    
    private int textId;    
    private Class fragment;   
    public MainTabBean(int textId, int imgId, Class fragment) {    
        this.textId = textId;    
        this.imgId = imgId;    
        this.fragment = fragment;    
    }
    
    public int getTextId() {
        return textId;
    }
    
    public void setTextId(int textId) {
        this.textId = textId;
    }
    
    public int getImgId() {
        return imgId;
    }
    
    public void setImgId(int imgId) {
        this.imgId = imgId;
    }
    
    public Class getFragment() {
        return fragment;
    }
    
    public void setFragment(Class fragment) {
        this.fragment = fragment;
    }
    
    List<MainTabBean> tabs = new ArrayList<>();
    // three TabBean instances
    TabBean homeTab = new MainTabBean(R.string.home, R.drawable.tab_home, HomepageFragment.class);
    TabBean postcardTab = new MainTabBean(R.string.postcard, R.drawable.tab_postcard, PostcardFragment.class);
    Bean notificationTab = new MainTabBean(R.string.notification, R.drawable.tab_notification, NotificationFragment.class);
    // put tabs into a list
    tabs.add(homeTab);
    tabs.add(postcardTab);
    tabs.add(notificationTab);
    
    // Obtain FragmentTabHost
    tabHost = findViewById(android.R.id.tabhost);
    // Associate fragmentManager with container
    tabHost.setup(this, getSupportFragmentManager(), R.id.main_content);
    // Create TabSpecs with TabBean and add it on TabHost
    for(MainTabBean tab : tabs) {
        TabHost.TabSpec spec = tabHost.newTabSpec(String.valueOf(tab.getTextId()))// set a tag
                                    .setIndicator(getTabIndicator(tab));// set an indicator
        tabHost.addTab(spec, tab.getFragment(), null);// add a tab
    }
    
    getSupportFragmentManager()
                    .findFragmentByTag(String.valueOf(tabs.get(1).getTextId()));
    
    tabs.get(0).getFragment().newInstance();