2 Stimmen

Sofortige "doppelte" Fragmente mit Aktionsleiste

Ich habe hier mehrere Beiträge über das Abnehmen und Anbringen gelesen. Aber es sollte in Ordnung sein, da ich API 15 verwende.

Ich erhalte von Anfang an eine doppelte Liste, wie Sie auf diesem Bild sehen können: image of activity

Ich habe den folgenden Code: (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) {
        }
    }
}

Und meine 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>

1voto

Graeme Punkte 25304

Sie instanziieren die Ansicht mit einem Fragment über Ihre layout.xml:

<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" />

Sie erstellen dann ein Registerkartensystem, bei dem die erste Registerkarte ausgewählt wird und ein weiteres Fragment (mit einem transparenten Hintergrund, nehme ich an) oben hinzugefügt wird.

Entfernen Sie die class="" und ändern Sie Ihre <fragment> zu einer <FrameLayout> . Dadurch wird das anfängliche Laden des Fragments gestoppt und Sie erhalten eine definierte Ansicht, in der Ihr Fragment untergebracht ist.

Außerdem fügen Sie Ihre neuen Fragmente der Android-Basisansicht hinzu android.R.id.content . Dies ist je nach Funktionalität sinnvoll, aber wenn Sie wollen, dass das Fragment den Platz des Elements einnimmt, sollten Sie dessen id verwenden. Ändern:

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

zu

ft.add(R.id.listFragment, mFragment, mTag);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X