Ошибка, переместив переменные с Intent - NullPointerException

Я пробую перемещать один 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.

3
задан 13.04.2017, 16:00
4 ответа

Я смог переместить в конце концов данные 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);
0
ответ дан 24.11.2019, 13:33

Ошибка говорит, что getString(R.string.nombre_mascota) == null следовательно, когда здесь intent.putExtra(getString(R.string.nombre_mascota),nombre); ты перемещаешь его nombre == null.

1
ответ дан 24.11.2019, 13:33
  • 1
    #191; qu и # 233; сформируй podr и # 237; чтобы это исправлять тогда? – Iván García 26.08.2016, 13:48
  • 2
    pets у него данные есть? я, что он сделал бы, он debugar, чтобы видеть, что есть перед в и # 241; adir в intent.... – joc 26.08.2016, 13:50
  • 3
    Я обновил и думаю, что я отвечаю тебе в t и # 250; спроси, 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);
1
ответ дан 24.11.2019, 13:33
  • 1
    Я выполнил " Клеан Project" и " Ребуильд Project" и даже схвати и # 237; продолжи давать ту же ошибку. – Iván García 27.08.2016, 11:56
  • 2
    Я издал мой вопрос bundle - null, использует getActivity (), чтобы конфигурировать твой intent, который откроет Activity, не getContext (). – Jorgesys♦ 27.08.2016, 16:23
  • 3
    Привет Елена, спасибо за твой ответ, но даже используя getActivity() в Intent, продолжает давать точно ту же ошибку. – Iván García 28.08.2016, 14:37
  1. Осуществляет интерфейс Parcelable в Pet.

  2. Готовит Bundle с одним ArrayList<Pet> с mГ©todo putParcelableArrayList(key,value).

  3. Получает 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, которая предлагает Яву, но он не советуется из-за отдачи.

1
ответ дан 24.11.2019, 13:33
  • 1
    Во мне и #250; ltima edici и # 243; n, я прокомментировал проблему, выполнив точно то, что ты говоришь. Сделав debugging, я наблюдаю, что переменная petsReceived продолжает быть недействительной – Iván García 29.08.2016, 13:21
  • 2
    Umm, верный. и #191; Ты пробовал с callback Activity, осуществленным твоим Fragment (и полученный в onAttach)? Aqu и # 237; post: laaptu.wordpress.com/tag/… – dddenis 29.08.2016, 13:34
  • 3
    Я вижу post и не sabr и # 237; в как осуществлять это во мне c и # 243; я говорю. Ах и # 237; он это делает с одним TextView, и #191; в моем случае tendr и # 237; во что перемещать один RecyclerView? – Iván García 29.08.2016, 13:57