2

3 つのタブを持つ 1 つの FragmentActivity 内で 1 つの FragmentTabHost を使用しています。各タブの最初のページからタブを変更すると正常に動作しますが、1 つのタブ内でフラグメントをスローしてからタブを変更すると、新しいフラグメントが古いフラグメントに重なって表示されます。誰かが私を助けることができますか?

これは FragmentActivity (fragments_tab.xml) のレイアウトです。

    <?xml version="1.0" encoding="UTF-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relativeLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/background_gradient">

    <ImageView
        android:contentDescription="@string/app_name"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:src="@drawable/background_gradient" />

    <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:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

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

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

        <LinearLayout
            android:id="@+id/realtabcontent"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>

    </LinearLayout>
    </android.support.v4.app.FragmentTabHost>
    </RelativeLayout>

私の FragmentActivity のコード:

    public class MainActivity extends FragmentActivity {

        private FragmentTabHost mTabHost;

        @Override   
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setDB();
            setContentView(R.layout.fragments_tab);

            mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);

            mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);


            mTabHost.addTab(mTabHost.newTabSpec("Home").setIndicator("Home",      getResources().getDrawable(R.drawable.ic_menu_home)),
                    HomeFragment.class, null);

            mTabHost.addTab(mTabHost.newTabSpec("Map").setIndicator("Map", getResources().getDrawable(R.drawable.ic_menu_mapmode)),
                    MapMenuFragment.class, null);
            mTabHost.addTab(mTabHost.newTabSpec("Info").setIndicator("Info", getResources().getDrawable(R.drawable.ic_menu_info_details)),
                    InfoFragment.class, null);
        }
}

各フラグメントは次のように作成されます。

public class InfoFragment extends Fragment {

    @Override
    public void onActivityCreated(Bundle savedInstanceState) 
    {
        super.onActivityCreated(savedInstanceState);
    }

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

誰かが私を助けてくれますか?

4

5 に答える 5

1

これはかなり古い質問であることは知っていますが、とにかく私の解決策を提供するので、この質問を読む人にとって役立つでしょう。私は同じ問題を抱えていましたが、問題は電話が原因であることに気付きました

mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

mTabHost.addTabこの呼び出しを行うと、タブホストはメソッドで指定されたすべてのフラグメントでこの FrameLayout を初期化するためです。

通話の問題を解決しました

mTabHost.setup(this, getSupportFragmentManager(), R.id.tabcontent);

このようにして、FrameLayout R.id.tabcontent は非表示になり (幅 = 0、高さ = 0)、単純に を実装するよりも、OnTabChangeListenerこれを行うことができます。

@Override
    public void onTabChanged(String tabId) {
        FragmentTransaction t = getSupportFragmentManager().beginTransaction();
        if (tabId.equals(Frament1.TAG)) {
            t.replace(R.id.realtabcontent, Fragment1.newInstance());
        } else if (tabId.equals(Frament2.TAG)) {
            t.replace(R.id.realtabcontent, Fragment2.newInstance());
        } else if (tabId.equals(Frament3.TAG)) {
            t.replace(R.id.realtabcontent, Fragment3.newInstance());
        }
        //optional
        t.addTobackStack();

        t.commit()
    }

それは動作するはずです

于 2014-10-29T14:08:39.720 に答える
0

私は実際にこれと同様の問題を抱えていました。ListFragment で項目を選択してから、新しいフラグメントを作成し、タブのレイアウトで元のリスト フラグメントを置き換えていました。他のタブに切り替えると、複数のフラグメントが同時に表示されたり、互いに重なり合ったりするという問題が発生したり、表示されるべきフラグメントが消えたりすることがわかりました。私の解決策は、新しいタブが選択されたときにバックスタックをクリアすることでした。このコードを TabListener の onTabSelected() メソッドに追加してみてください

FragmentManager manager = getSupportFragmentManager();

    if(manager.getBackStackEntryCount() > 0)
    {
        manager.popBackStack(null, 
                             FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }

これを行うと、問題が解決しました。

于 2013-03-01T01:45:08.557 に答える