setarguments putextra pass getintent from data activity java android android-intent nullpointerexception

java - putextra - Android: pasar datos(extras) a un fragmento



send string to fragment android (4)

Dos cosas. Primero, no creo que esté agregando los datos que desea pasar al fragmento correctamente. Lo que necesita pasar al fragmento es un paquete, no un intento. Por ejemplo, si quisiera enviar un valor int a un fragmento, crearía un paquete, pondría el int en ese paquete y luego establecería ese paquete como un argumento para usar cuando se creó el fragmento.

Bundle bundle = new Bundle(); bundle.putInt(key, value); fragment.setArguments(bundle);

En segundo lugar para recuperar esa información, necesita obtener los argumentos enviados al fragmento. A continuación, extrae el valor según la clave con la que lo identificaste. Por ejemplo en tu fragmento:

Bundle bundle = this.getArguments(); if (bundle != null) { int i = bundle.getInt(key, defaulValue); }

Lo que recibirá cambios dependerá de lo que ponga. Además, el valor predeterminado suele ser null pero no tiene que serlo. Depende de si establece un valor predeterminado para ese argumento.

Por último, no creo que puedas hacer esto en onCreateView . Creo que debes recuperar estos datos en el método onActivityCreated tu fragmento. Mi razonamiento es el siguiente. onActivityCreated ejecuta después de que la actividad subyacente haya terminado su propio método onCreate . Si está colocando la información que desea recuperar dentro del paquete durante el método onCreate de su actividad, no existirá durante el fragmento onCreateView . Trate de usar esto en onActivityCreated y simplemente actualice su contenido ListView más tarde.

Soy nuevo en la programación de Android y tengo problemas al pasar un ArrayList de Parcelable a un fragmento. Esta es la Actividad que se inicia (¡funciona bien!) Donde la lista de feed es una ArrayList de una Música parcelable.

Intent in = new Intent(context, ListMusicsActivity.class); in.putExtra("arrayMusic", feedList); activity.startActivity(in);

El fragmento de método Activity onCreate ():

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activitymusiclist); if(savedInstanceState != null) { ListMusicFragment frag = new ListMusicFragment(); frag.setArguments(getIntent().getExtras()); } }

El código de Fragmento:

public class ListMusicFragment extends SherlockFragment{ private ArrayList<Music> listMusics = new ArrayList<Music>(); private ListView listMusic; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { listMusics = (ArrayList<Music>) getArguments().getSerializable("arrayMusic"); View view = inflater.inflate(R.layout.musiclistview, container, false); listMusic = (ListView) view.findViewById(R.id.musicListView); listMusic.setAdapter(new MusicBaseAdapter(getActivity(), listMusics)); return view; } }

Creo que el problema está en la línea

listMusics = (ArrayList<Music>) getArguments().getSerializable("arrayMusic");

Finalmente esta es mi clase de Música:

public class Music implements Parcelable{ private String url; private String artist; private String title; private String duration; private String info_url; private String lyrics; public Music(String url, String artist, String title, String duration, String lyrics, String info_url) { this.url = url; this.artist = artist; this.title = title; this.duration = duration; this.lyrics = lyrics; this.info_url = info_url; } public Music(Parcel in) { url = ParcelUtils.readString(in); artist = ParcelUtils.readString(in); title = ParcelUtils.readString(in); duration = ParcelUtils.readString(in); info_url = ParcelUtils.readString(in); lyrics = ParcelUtils.readString(in); } public String getUrl() { return url; } public String getArtist() { return artist; } public String getTitle() { return title; } public String getDuration() { return duration; } public String getLyrics() { return lyrics; } public String getInfo() { return info_url; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { ParcelUtils.writeString(dest, url); ParcelUtils.writeString(dest, artist); ParcelUtils.writeString(dest, title); ParcelUtils.writeString(dest, duration); ParcelUtils.writeString(dest, lyrics); ParcelUtils.writeString(dest, info_url); } public static final Parcelable.Creator<Music> CREATOR = new Parcelable.Creator<Music>() { public Music createFromParcel(Parcel in) { return new Music(in); } public Music[] newArray(int size) { return new Music[size]; } }; }

Cuando ejecuto este código, el problema que obtengo es una java.lang.NullPointerException en el método Fragment onCreateView () . Agradecería mucho si alguien me indicara en la dirección correcta para ver dónde estoy fallando.

EDITAR : Problema resuelto: solo necesitaba agregar esta línea al método Activity onCreate () (de otra manera getArguments () devolvería null):

getSupportFragmentManager().beginTransaction() .add(android.R.id.content, frag).commit();

Y agrega esto al código de fragmento:

@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Bundle bundle = getArguments(); if(bundle != null) { listMusics = bundle.getParcelableArrayList("arrayMusic"); listMusic.setAdapter(new MusicBaseAdapter(getActivity(), listMusics)); } }

donde, listMusics es una ArrayList de Parcelable Music.


Hay un simple por qué preferí el paquete debido a que no hay datos duplicados en la memoria. Consiste en un método público init para el fragmento

private ArrayList<Music> listMusics = new ArrayList<Music>(); private ListView listMusic; public static ListMusicFragment createInstance(List<Music> music) { ListMusicFragment fragment = new ListMusicFragment(); fragment.init(music); return fragment; } public void init(List<Music> music){ this.listMusic = music; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.musiclistview, container, false); listMusic = (ListView) view.findViewById(R.id.musicListView); listMusic.setAdapter(new MusicBaseAdapter(getActivity(), listMusics)); return view; } }

En dos palabras, usted crea una instancia del fragmento una por el método init (puede llamarlo como desee) pasa la referencia de su lista sin crear una copia por serialización a la instancia del fragmento. Esto es muy útil porque si cambias algo en la lista lo obtendrás en las otras partes de la aplicación y por supuesto, usarás menos memoria.


Prefiero Serializable = sin código repetitivo. Para pasar datos a otros Fragmentos o Actividades, la diferencia de velocidad a Parcelable no importa.

También siempre proporcionaría un método de ayuda para un Fragment o Activity , de esta manera siempre se sabe qué datos se deben pasar. Aquí un ejemplo para su ListMusicFragment :

private static final String EXTRA_MUSIC_LIST = "music_list"; public static ListMusicFragment createInstance(List<Music> music) { ListMusicFragment fragment = new ListMusicFragment(); Bundle bundle = new Bundle(); bundle.putSerializable(EXTRA_MUSIC_LIST, music); fragment.setArguments(bundle); return fragment; } @Override public View onCreateView(...) { ... Bundle bundle = intent.getArguments(); List<Music> musicList = (List<Music>)bundle.getSerializable(EXTRA_MUSIC_LIST); ... }


gran respuesta por @Rarw. Intente usar un paquete para pasar información de un fragmento a otro