it-swarm.com.de

Wo / wie getIntent (). GetExtras () in einem Android Fragment?

Bei Aktivitäten habe ich Folgendes gemacht:

In Aktivität 1:

Intent i = new Intent(getApplicationContext(), MyFragmentActivity.class);
                i.putExtra("name", items.get(arg2));
                i.putExtra("category", Category);
                startActivity(i);

In Aktivität 2:

Item = getIntent().getExtras().getString("name");

Wie macht man das mit Fragmenten? Ich benutze auch die Kompatibilitätsbibliothek v4.

Geht es in die FragmentActivity? Oder das eigentliche Fragment? Und in welche Methode geht es? onCreate? onCreateView? Ein weiterer?

Und kann ich bitte Beispielcode sehen?

BEARBEITEN: Es ist erwähnenswert, dass ich versuche, Aktivität 1 als Aktivität (oder tatsächlich als ListActivity, bei der ich beim Klicken die Absicht des Listenelements übergebe) beizubehalten und dann zu einer Reihe von Fragmenten mit Registerkarten (durch eine Fragmentaktivität) überzugehen Benötigen Sie eine der beiden Registerkarten, um die Extras zu erhalten. (Ich hoffe das ist möglich?)

101
KickingLettuce

Ich tendiere dazu, und ich glaube, dies ist das, was Google auch für Entwickler vorhatte, die Extras von einem Intent in einem Activity zu erhalten und dann alle zusätzlichen Daten an Fragmente zu übergeben indem sie mit Argumenten instanziiert werden.

Es gibt tatsächlich ein Beispiel auf dem Android dev-Blog, das dieses Konzept veranschaulicht, und Sie werden dies in mehreren von sehen Auch die API-Demos. Obwohl dieses spezielle Beispiel für API 3.0+ -Fragmente angegeben ist, gilt der gleiche Ablauf bei Verwendung von FragmentActivity und Fragment aus der Unterstützungsbibliothek.

Sie rufen zunächst die Intent-Extras wie gewohnt in Ihrer Aktivität auf und geben sie als Argumente an das Fragment weiter:

public static class DetailsActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // (omitted some other stuff)

        if (savedInstanceState == null) {
            // During initial setup, plug in the details fragment.
            DetailsFragment details = new DetailsFragment();
            details.setArguments(getIntent().getExtras());
            getSupportFragmentManager().beginTransaction().add(
                    Android.R.id.content, details).commit();
        }
    }
}

Anstatt den Konstruktor direkt aufzurufen, ist es wahrscheinlich einfacher, eine statische Methode zu verwenden, die die Argumente für Sie in das Fragment einfügt. Eine solche Methode wird in den Beispielen von Google häufig als newInstance bezeichnet . Es gibt tatsächlich eine newInstance -Methode in DetailsFragment, daher bin ich mir nicht sicher, warum sie im obigen Snippet nicht verwendet wird ...

Auf jeden Fall sind alle Extras, die beim Erstellen des Fragments als Argument angegeben wurden, durch Aufrufen von getArguments() verfügbar. Da dies ein Bundle zurückgibt, ähnelt seine Verwendung der der Extras in einem Activity.

public static class DetailsFragment extends Fragment {
    /**
     * Create a new instance of DetailsFragment, initialized to
     * show the text at 'index'.
     */
    public static DetailsFragment newInstance(int index) {
        DetailsFragment f = new DetailsFragment();

        // Supply index input as an argument.
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);

        return f;
    }

    public int getShownIndex() {
        return getArguments().getInt("index", 0);
    }

    // (other stuff omitted)

}
108
MH.

sie können immer noch verwenden

String Item = getIntent().getExtras().getString("name");

im fragment müssen Sie nur getActivity() aufrufen:

String Item = getActivity().getIntent().getExtras().getString("name");

Dadurch müssen Sie keinen Code schreiben.

169
meeeee