There are several issues related to this problem. For example, this one . But that does not work.
Let me show you what I did in my code.
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 (my main fragment, which includes 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 (for a fragment corresponding to another tab, they are similar, so I only show one code)
<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"> <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); } }
public class MyFragment extends Fragment implements 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); }
}
My problem is that BaseFragment is always null in my onTabChanged. Can anyone help? Thanks.