Я пробую перемещать один ArrayList<Pet>
с одного Fragment
в меня MainActivity.java
для отсюда, если нажимается один ImageButton
(бруска действия) давайте идти в другую активность, в которой я нуждаюсь в данных вышеупомянутого ArrayList. Ну вот, создал один Intent
в моем классе Fragment
и один bundle
чтобы получать эти данные во мне MainActivity
и меня отпускает исключение NullPointerException
получив эти данные.
Код Intent
класса Fragment
//Intent
Intent intent = new Intent(getContext(), MainActivity.class);
String [] nombre = new String [pets.size()];
int []numeroLikes = new int[pets.size()];
int []foto = new int [pets.size()];
for (int i = 0;i<pets.size();i++){
nombre [i] = pets.get(i).getPetName();
numeroLikes[i]=pets.get(i).getNumberOfLikes();
foto[i] = pets.get(i).getFoto();
}
intent.putExtra(getString(R.string.nombre_mascota),nombre);
intent.putExtra(getString(R.string.numberOfLikes),numeroLikes);
intent.putExtra(getString(R.string.foto),foto);
startActivity(intent);
Код Bundle
чтобы получать данные в MainActivity
//Bundle para inicializar pets
Bundle bundle = getIntent().getExtras();
String [] nombres = bundle.getStringArray(getString(R.string.nombre_mascota));
int [] nLikes = bundle.getIntArray(getString(R.string.numberOfLikes));
int [] foto = bundle.getIntArray(getString(R.string.foto));
for (int i = 0; i<nombres.length;i++){
pets.add(new Pet(nLikes[i],nombres[i],foto[i]));
}
В этой точке меня отпускает ошибка, в линии:
String [] nombres = bundle.getStringArray(getString(R.string.nombre_mascota));
Не, по какой причине у меня выходит один nullPointerException
если все ссылки хорошо помещены. Если это ошибка логики программирования, мне хотелось бы, что вы прокомментировали это мне также.
Не, если это будет важно, но комментарий, что я Fragment
будь составлен одним RecyclerView
Ошибка - следующая:
08-26 09:19:07.807 8061-8061/es.uclm.mylittlepets E/AndroidRuntime: FATAL EXCEPTION: main
Process: es.uclm.mylittlepets, PID: 8061
java.lang.RuntimeException: Unable to start activity ComponentInfo{es.uclm.mylittlepets/es.uclm.mylittlepets.Layout.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String[] android.os.Bundle.getStringArray(java.lang.String)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String[] android.os.Bundle.getStringArray(java.lang.String)' on a null object reference
at es.uclm.mylittlepets.Layout.MainActivity.onCreate(MainActivity.java:55)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
EDIT 1: pets
, ArrayList, да, у которого есть данные. Непосредственно перед Intent, я звоню в метод inicializarMascotas()
контент которого:
public void inicializarMascotas(){
pets.add(new Pet(0,"Pet1",R.drawable.perro));
pets.add(new Pet(0,"Pet2",R.drawable.burro));
pets.add(new Pet(0,"Pet3", R.drawable.cangrejo));
pets.add(new Pet(0,"Pet4",R.drawable.gallo));
pets.add(new Pet(0,"Pet5",R.drawable.pulpo));
}
Строитель класса Pet
получи: (int numeroLikes, String nombre_mascota, int foto)
EDIT 2:
Пользователь комментировал мне, что он был бы должен пытаться осуществляя интерфейс Parcelable
, и так я это сделал.
1. - В моем POJO Pet
, я помог Parcelable
с Вашими обязательными методами.
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(numberOfLikes);
parcel.writeInt(foto);
parcel.writeString(petName);
}
public void readToParcel (Parcel parcel){
numberOfLikes = parcel.readInt();
foto = parcel.readInt();
petName = parcel.readString();
}
Я добавил также строитель следующей формы:
public Pet (Parcel parcel){
readToParcel(parcel);
}
В конце концов, также есться sobreescrito это:
public static final Parcelable.Creator<Pet> CREATOR = new Parcelable.Creator<Pet>() {
@Override
public Pet createFromParcel(Parcel in) {
return new Pet(in);
}
@Override
public Pet[] newArray(int size) {
return new Pet[size];
}
};
2. - В моем классе Fragment
источника, Intent
останься следующей формы:
Intent intent = new Intent(getActivity(),MainActivity.class);
intent.putExtra("array",pets);
startActivity(intent);
3. - В моем классе MainActivity
я получил такие данные:
pets = getIntent().getParcelableArrayListExtra("array");
Если я пробую делать что-то типом:
Log.i("nombre", pets.get(0).getPetName());
Ошибка, которая дает мне, - точно та же самая наверху в вышеупомянутой линии.
EDIT 3: С ответом пользователя @dddenis, не выходит исключение NullPointerException
но, кажется, войди в бесконечный цикл, в котором повторяются эти линии в logcat
:
08-29 10:13:50.414 14960-15004/es.uclm.mylittlepets E/Surface: getSlotFromBufferLocked: unknown буфер: 0x9ece3960
08-29 10:13:50.439 14960-14960/es.uclm.mylittlepets I/AppCompatViewInflater: app:theme is now deprecated. Please move to using android:theme instead.
08-29 10:13:50.509 14960-15004/es.uclm.mylittlepets W/EGL_emulation: eglSurfaceAttrib not implemented
08-29 10:13:50.509 14960-15004/es.uclm.mylittlepets W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x9e66c200, error=EGL_SUCCESS
08-29 10:13:50.532 14960-14960/es.uclm.mylittlepets E/RecyclerView: Не adapter attached; skipping layout
08-29 10:13:50.584 14960-14960/es.uclm.mylittlepets E/RecyclerView: Не adapter attached; skipping layout
08-29 10:13:50.612 14960-14960/es.uclm.mylittlepets I/AppCompatViewInflater: app:theme is now deprecated. Please move to using android:theme instead.
Я смог переместить в конце концов данные Fragment
в MainActivity
. Я сделал это следующей формой:
В МОЕМ КЛАССЕ
Fragment
.
1.-Creo интерфейс FragmentIterationListener
который я буду использовать, чтобы общаться с Activity
.
public interface FragmentIterationListener{
public void onFragmentIteration(Bundle parameters);
}
Давайте верить в признак private FragmentIterationListener mcallback
который мы используем, чтобы перемещать данные в Activity
.
2. - В методе onAttach(Activity activity)
мы делаем следующее:
try {
mcallback = (FragmentIterationListener) activity;
}catch(ClassCastException ex){
Log.e("PetsFragment","El activity debe implementar la interfaz FragmentIterationListener");
}
Таким образом, мы распределяем в наш признак Activity
с которым оно будет общаться.
3. - В методе onCreateView()
, кроме того, что надувает Layout
instanciamos наш RecyclerView
.
recyclerView = (RecyclerView) view.findViewById(R.id.rvPets);
4. - В методе onViewCreated()
мы устанавливаем RecyclerView
как один LinearLayout
, мы инициализируем ArrayList <Pet> pets
и мы перемещаем это его в класс MainActivity
следующей формы:
Bundle extras = new Bundle();
extras.putParcelableArrayList("EXTRA_PETS", pets);
mcallback.onFragmentIteration(extras);
В МОЕМ КЛАССЕ
MainActivity.java
1. - Мы осуществляем интерфейс, который мы создали ранее:
public class MainActivity extends AppCompatActivity implements PetsFragment.FragmentIterationListener{
2. - Мы осуществляем обязательный метод этого интерфейса:
public void onFragmentIteration(Bundle parameters) {
pets = parameters.getParcelableArrayList("EXTRA_PETS");
}
3. - Мы получаем данные о следующей форме (в методе onCreate()
):
Bundle bundle = new Bundle();
onFragmentIteration(bundle);
Ошибка говорит, что getString(R.string.nombre_mascota) == null
следовательно, когда здесь intent.putExtra(getString(R.string.nombre_mascota),nombre);
ты перемещаешь его nombre == null
.
pets
у него данные есть? я, что он сделал бы, он debugar, чтобы видеть, что есть перед в и # 241; adir в intent....
– joc
26.08.2016, 13:50
pets
s и # 237; у которого есть данные.
– Iván García
26.08.2016, 13:55
В тебе cГіdigo так отправление такой
intent.putExtra(getString(R.string.nombre_mascota),nombre);
как она recepciГіn договоренности правилен:
Bundle bundle = getIntent().getExtras();
String [] nombres = bundle.getStringArray(getString(R.string.nombre_mascota));
называет Мне она atenciГіn эту деталь:
Caused by: java.lang. NullPointerException: Виртуальный Attempt to invoke method 'java.lang. String [] android.os. Bundle.getStringArray (java.lang. String)' on в null object reference
ты выполняешь mГ©todo getStringArray()
из инстанции bundle, у которого есть стоимость null.
Использует getActivity()
вместо getContext()
, чтобы получать контекст Activity во фрагменте и это использовать в твоем intent:
Intent intent = new Intent(getActivity(), MainActivity.class);
getActivity()
в Intent
, продолжает давать точно ту же ошибку.
– Iván García
28.08.2016, 14:37
Осуществляет интерфейс Parcelable
в Pet
.
Готовит Bundle
с одним ArrayList<Pet>
с mГ©todo putParcelableArrayList(key,value)
.
Получает ArrayList<Pet>
с mГ©todo getParcelableArrayList(key)
из Bundle
.
ДАННЫХ, КОТОРЫЕ ДОЛЖНЫ ПОСЫЛАТЬ
List<Pet> pets = new ArrayList<Pet>(){
{
add(new Pet(0,"Pet1",R.drawable.perro));
add(new Pet(0,"Pet2",R.drawable.burro));
add(new Pet(0,"Pet3", R.drawable.cangrejo));
add(new Pet(0,"Pet4",R.drawable.gallo));
add(new Pet(0,"Pet5",R.drawable.pulpo));
}
};
PREPARACIГ “N ДАННЫХ
Bundle extras = new Bundle();
extras.putParcelableArrayList("EXTRA_PETS", (ArrayList<Pet>) pets);
ENVГЌO ДАННЫХ
Intent intent = new Intent(this, MainActivity.class).putExtras(extras);
startActivity(intent);
RECEPCIГ “N ДАННЫХ
List<Pet> petsReceived = getIntent().getParcelableArrayList("EXTRA_PETS");
PD: Возможно реализовывать tambiГ©n (и во многих меньше шагов), с SerializaciГіn, которая предлагает Яву, но он не советуется из-за отдачи.
petsReceived
продолжает быть недействительной
– Iván García
29.08.2016, 13:21
TextView
, и #191; в моем случае tendr и # 237; во что перемещать один RecyclerView
?
– Iván García
29.08.2016, 13:57