FragmentTabHost不显示选项卡内容

时间:2013-07-11 08:52:25

标签: android android-fragments navigation-drawer fragment-tab-host

我有一个应用程序,它包含一个用于导航的抽屉菜单和一个片段活动,其中根据抽屉选择显示一个片段。现在我有2个片段,一个简单的片段(SettingsFragment)和一个包含FragmentTabHost(SearchFragment)的片段。打开应用程序时会显示FragmentTabHost。问题是,如果我在片段之间切换 - 转到设置片段然后返回到SearchFragment,那么tabhost的内容不再显示(第一个选项卡中包含的片段的onCreateView没有被调用),除非我在标签之间切换。

所以我在我的活动中使用替换片段之间进行了更改:

public void replaceRightFragment(int fragmentId) {
        Fragment newFragment = null;
        switch (fragmentId) {
            case FRAGMENT_SEARCH_PROPERTY:
                newFragment = getSupportFragmentManager().findFragmentByTag(SearchPropertyFragment.class.getSimpleName());
                if (newFragment == null) {
                    newFragment = new SearchPropertyFragment();
                }
                break;
            case FRAGMENT_SETTINGS:
                newFragment = getSupportFragmentManager().findFragmentByTag(SettingsFragment.class.getSimpleName());
                if (newFragment == null) {
                    newFragment = new SettingsFragment();
                }
                break;
        }

        if (newFragment != null) {
            if (!newFragment.isVisible()) {
                FragmentManager fragmentManager = getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

                // Replace whatever is in the fragment_container view with this fragment,
                // and add the transaction to the back stack

                fragmentTransaction.replace(R.id.main_view, newFragment, newFragment.getClass().getSimpleName());
                // fragmentTransaction.remove(mainFragment);
                // fragmentTransaction.add(R.id.main_view, newFragment, newFragment.getClass().getSimpleName());

//            fragmentTransaction.addToBackStack(null);

                // Commit the transaction
                fragmentTransaction.commitAllowingStateLoss();
            }
            hideSlideMenu();
            hideKeyboard();
        }

    }

我的tabhost布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
    >

    <include layout="@layout/header_bar"/>

    <android.support.v4.app.FragmentTabHost
        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:orientation="vertical">

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="0"
                android:orientation="horizontal"
                />

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_weight="0"
                />

            <FrameLayout
                android:id="@+id/realtabcontent"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                />
        </LinearLayout>
    </android.support.v4.app.FragmentTabHost>

</LinearLayout>

...和片段中的tabhost设置:

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

    mTabHost = (FragmentTabHost) view.findViewById(android.R.id.tabhost);
    mTabHost.setup(getActivity(),
            getActivity().getSupportFragmentManager(), R.id.realtabcontent);

    mTabHost.addTab(
            mTabHost.newTabSpec(SELL_FRAGMENT_TAG).setIndicator(
                    getString(R.string.search_property_sell_tab_title)),
            SearchPropertySellFragmentTab.class, null);
    mTabHost.addTab(
            mTabHost.newTabSpec(RENT_FRAGMENT_TAG).setIndicator(
                    getString(R.string.search_property_rent_tab_title)),
            SearchPropertyRentFragmentTab.class, null);
    mTabHost.addTab(
            mTabHost.newTabSpec(ADD_ADVERT_FRAGMENT_TAG).setIndicator(
                    getString(R.string.search_property_add_tab_title)),
            SearchPropertyAddAdvertFragmentTab.class, null);

    ImageButton mDrawerButton = (ImageButton) view.findViewById(R.id.drawer_button);
    mDrawerButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            ((DrawerMenuController) getActivity()).onDrawerButtonPressed();
//          if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
//              mDrawerLayout.closeDrawer(mDrawerList);
//          } else {
//              mDrawerLayout.openDrawer(mDrawerList);
//          }
        }
    });
    mTabHost.onTabChanged(SELL_FRAGMENT_TAG);
    mTabHost.setOnTabChangedListener(this);

    return view;
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    mTabHost.removeAllViews();
    mTabHost = null;
}

任何提示?

1 个答案:

答案 0 :(得分:1)

  

不需要TabWidget,FragmentTabHost会自动添加它。           如果你希望选项卡位于顶部,请将此wedgit放在realtabcontent上面!

但你可以像我一样自定义它......

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout
    android:id="@+id/realtabcontent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@android:id/tabhost" />

<FrameLayout
    android:id="@+id/homeContent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@android:id/tabhost"
    android:layout_marginTop="@dimen/button_height"
    android:background="#ffffff"
    android:visibility="gone" >
</FrameLayout>

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:background="#ffffff"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/btn_homeScreen_tab"
        android:layout_width="@dimen/button_height"
        android:layout_height="@dimen/button_height"
        android:layout_alignParentLeft="true"
        android:src="@drawable/grange_logo" />

    <android.support.v4.app.FragmentTabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_marginLeft="@dimen/button_height"
        android:layout_marginRight="@dimen/button_height" />

    <ImageView
        android:id="@+id/ph_lable_title"
        android:layout_width="@dimen/button_height"
        android:layout_height="@dimen/button_height"
        android:layout_alignParentRight="true"
        android:src="@drawable/contact_1" />
</RelativeLayout>