94 votos

¿Dónde y cómo a getIntent().getExtras() en un fragmento de Android?

Con Actividades, yo solía hacer esto:

En La Actividad 1:

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

En La Actividad 2:

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

¿Cómo hacer esto utilizando Fragmentos? Yo estoy usando la librería de compatibilidad v4 también.

¿Va en la FragmentActivity? O el Fragmento? Y el Método Que hace que se vaya? onCreate? onCreateView? otro?

Y puedo ver el código de ejemplo por favor?

EDIT: vale la pena señalar estoy tratando de mantener la Actividad 1 como una Actividad (o en realidad ListActivity donde yo estoy pasando la intención de la listitem cuando se hace clic) y, a continuación, pasar a un conjunto de fichas de fragmentos (a través de un Fragmento de Actividad) y necesito la ficha para ser capaz de obtener los extras. (Espero que esto sea posible?)

163voto

meeeee Puntos 825

puede usar Item = getIntent().getExtras().getString("name"); en el fragmento, sólo necesita llamar getActivity() primero:

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

Esto le ahorra tener que escribir código.

103voto

MH. Puntos 21672

Lo que tendemos a hacer, y creo que esto es lo que Google destinada a los desarrolladores hacer demasiado, es todavía conseguir los extras de una Intent en Activity y, a continuación, pasar algún extra de datos para los fragmentos mediante la creación de instancias con argumentos.

De hecho, hay un ejemplo en el Android dev blog que ilustra este concepto, y verás esto en varias de las API demos demasiado. Aunque este ejemplo es dado por la API 3.0+ fragmentos, el flujo mismo se aplica cuando se utiliza FragmentActivity y Fragment a partir de la biblioteca de compatibilidad.

Primero recuperar la intención extras como de costumbre en su actividad y pasarlos como argumentos para el fragmento:

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

En lugar de invocar directamente el constructor, es probablemente más fácil para utilizar un método estático que los tapones de los argumentos en el fragmento. Este método es a menudo llamado newInstance en los ejemplos proporcionados por Google. Realmente hay un newInstance método en DetailsFragment, así que estoy seguro de por qué no se utiliza en el fragmento de arriba...

De todos modos, todos los extras siempre como argumento al momento de crear el fragmento, estará disponible llamando getArguments(). Desde este devuelve un Bundle, su uso es similar a la de los extras en un 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)

}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X