Как получить текущий выделенный фрагмент в FragmentTabHost

Есть несколько вопросов, связанных с этой же проблемой. Например, этот . Но это не сработает.

Позвольте мне показать, что я сделал в своем коде.

activity_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> 

Fragment_my.xml (мой основной фрагмент, который включает FragmentTabHost)

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.app.FragmentTabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:weightSum="100" android:orientation="horizontal"> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="0" /> <LinearLayout android:layout_width="0dp" android:layout_weight="95" android:layout_height="match_parent" android:orientation="vertical"> <FrameLayout android:id="@+id/panel_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> </LinearLayout> </android.support.v4.app.FragmentTabHost> 

Fragment_tab1.xml (для фрагмента, соответствующего другой вкладке, они похожи, поэтому я показываю только один код)

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.zhouhao.test.TabFragment"> <!-- TODO: Update blank fragment layout --> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/fragment_tab1" /> </FrameLayout> 

MainActivity.java

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState == null) { FragmentManager fm = getSupportFragmentManager(); mMyFragment = (MyFragment) fm.findFragmentById(R.id.my_fragment); } } 

Открытый класс MyFragment extends Fragment реализует 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 всегда имеет значение null в моем 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}