2

ここで、デタッチとアタッチに関するいくつかの投稿を読みました。しかし、API 15 を実行しているので問題ないはずです。

この写真でわかるように、最初から二重のリストを取得します。 活動イメージ

次のコードがあります: (MainActivity)

   package dk.metnik.fragmentandactionbar;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import dk.metnik.fragmentandactionbar.fragments.DCIMFragment;
import dk.metnik.fragmentandactionbar.fragments.ESSFragment;
import dk.metnik.fragmentandactionbar.fragments.TeamshareFragment;

public class FragAndBarActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setupTabs();
    }

    private void setupTabs() {
        // setup action bar for tabs
        ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionBar.setDisplayShowTitleEnabled(false);

        Tab tab = actionBar
                .newTab()
                .setText("DCIM")
                .setTabListener(
                        new MyTabListener<DCIMFragment>(this, "DCIM",
                                DCIMFragment.class));
        actionBar.addTab(tab);

        tab = actionBar
                .newTab()
                .setText("ESS")
                .setTabListener(
                        new MyTabListener<ESSFragment>(this, "ESS",
                                ESSFragment.class));
        actionBar.addTab(tab);

        tab = actionBar
                .newTab()
                .setText("TeamShare")
                .setTabListener(
                        new MyTabListener<TeamshareFragment>(this, "TeamShare",
                                TeamshareFragment.class));
        actionBar.addTab(tab);
    }

    public static class MyTabListener<T extends Fragment> implements
            TabListener {
        private Fragment mFragment;
        private final Activity mActivity;
        private final String mTag;
        private final Class<T> mClass;

        /**
         * Constructor used each time a new tab is created.
         * 
         * @param activity
         *            The host Activity, used to instantiate the fragment
         * @param tag
         *            The identifier tag for the fragment
         * @param clz
         *            The fragment's Class, used to instantiate the fragment
         */

        public MyTabListener(Activity activity, String tag, Class<T> clz) {
            mActivity = activity;
            mTag = tag;
            mClass = clz;

            mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
            if (mFragment != null) { // && !mFragment.isDetached()) {
                FragmentTransaction ft = mActivity.getFragmentManager()
                        .beginTransaction();
                // ft.detach(mFragment);
                ft.remove(mFragment);
                ft.commit();
            }
        }

        /* The following are each of the ActionBar.TabListener callbacks */

        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            // Check if the fragment is already initialized
            if (mFragment == null) {
                // If not, instantiate and add it to the activity
                mFragment = Fragment.instantiate(mActivity, mClass.getName());
                ft.add(R.id.listFragment, mFragment, mTag);
            } else {
                ft.attach(mFragment);
            }
        }

        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            if (mFragment != null) {
                ft.detach(mFragment);
            }
        }

        public void onTabReselected(Tab tab, FragmentTransaction ft) {
        }
    }
}

そして私のmain.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <fragment
        android:id="@+id/listFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="?android:attr/actionBarSize"/>
</LinearLayout>  
4

1 に答える 1

1

layout.xml を介して Fragment を使用してビューをインスタンス化しています。

<fragment
    android:id="@+id/listFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="?android:attr/actionBarSize"
    class="dk.metnik.fragmentandactionbar.fragments.TeamshareFragment" />

次に、最初のタブが選択されるタブ システムを作成し、別のフラグメント (私が推測している透明な背景) を追加します。

を削除し、class=""を に変更<fragment>します<FrameLayout>。これにより、Fragment を格納する定義済みの View が提供されている間、最初の Fragment の読み込みが停止します。

また、新しいフラグメントを Android ベースの View に追加していますandroid.R.id.content。これは機能によっては合理的ですが、フラグメントに要素のスペースを使用させたい場合は、その ID を使用する必要があります。変化する:

ft.add(android.R.id.content, mFragment, mTag); 

ft.add(R.id.listFragment, mFragment, mTag);
于 2012-08-28T08:35:29.410 に答える