FragmentTabHost не отображает содержимое вкладки

У меня есть приложение, которое содержит меню ящика для навигации и действие фрагмента, в котором фрагмент отображается в зависимости от выбора ящика. Теперь у меня есть 2 фрагмента: простой (SettingsFragment) и один, содержащий FragmentTabHost (SearchFragment). С помощью FragmentTabHost отображается при открытии приложения. Проблема в том, что если я переключаюсь между фрагментами - перейдите к фрагменту настроек, затем вернитесь к SearchFragment, тогда содержимое вкладки больше не отображается (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();
        }

    }

Мой макет табуляции:

<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;
}

Любые подсказки?


person laurentiugh    schedule 11.07.2013    source источник
comment
Поскольку вы используете FragmentTabHost (где вкладки являются фрагментами) в другом Fragment, вам нужно передать getChildFragmentManager() методу setup() вместо FragmentManager действия.   -  person user    schedule 12.07.2013


Ответы (1)


НЕ нужен TabWidget, FragmentTabHost добавит его автоматически. Поместите этот виджет над реальным содержанием вкладок, если вы хотите, чтобы вкладки были вверху!

но вы можете настроить его так, как я сделал...

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

person Aarun    schedule 07.10.2013