2016-08-05 4 views
1

Ich habe eine ArrayList von URIs, die ich verwende, um in der Lage zu sein, jedes Mal durch die Bilder zu iterieren und ein einzelnes ImageView zu aktualisieren. Ich bekomme eine NullPointerException, wenn ich nah dran bin und ich glaube, dass es mit der Kamera zu tun hat, die meinen Bildschirm dreht (die Aktivität zerstört), wenn es darum geht, die vorher erwähnten Bilder aufzunehmen.Wie speichere ich eine ArrayList <Uri> auf dem Bildschirm drehen?

Wie könnte das mit onSaveInstanceState und onResume-- aussehen?

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageURI(android.net.Uri)' on a null object reference 
at plaidshorts.rafael.myapplication.Person1Screen$5.onClick(Person1Screen.java:124) 
at android.view.View.performClick(View.java:5209) 
at android.view.View$PerformClick.run(View.java:21174) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5477) 
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) 

Linie 124:

mainView.setImageURI(happyList.get(0)); 

Meine dispatchTakePictureIntent für Kamera oder Galerie aufgefordert, zweimal (die Schleife am Anfang sehen). OnActivityResult nimmt dann den URI und fügt ihn happyList hinzu (der in onCreate instanziiert wurde).

private void dispatchTakePictureIntent() { 
    pictureCounter = -1; 
    for(int i = 0; i < 2; i++) { 
     pictureCounter++; 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
      // Create the File where the photo should go 
      File photoFile = null; 
      try { 
       photoFile = createImageFile(); 
       outputFileUri = Uri.fromFile(photoFile); 
      } catch (IOException ex) { 
       Log.w("error","IOException"); 
      }catch (NullPointerException nullEx) { 
       Log.w("error","NullPointerException"); 
      } 
      // Camera. 
      final List<Intent> cameraIntents = new ArrayList<Intent>(); 
      final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      final PackageManager packageManager = getPackageManager(); 
      final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0); 
      for (ResolveInfo res : listCam) { 
       final String packageName = res.activityInfo.packageName; 
       final Intent intent = new Intent(captureIntent); 
       intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); 
       intent.setPackage(packageName); 
       intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
       cameraIntents.add(intent); 
      } 
      // Filesystem. 
      final Intent galleryIntent = new Intent(); 
      galleryIntent.setType("image/*"); 
      galleryIntent.setAction(Intent.ACTION_GET_CONTENT); 
      // Chooser of filesystem options. 
      final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source"); 
      // Add the camera options. 
      chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()])); 
      startActivityForResult(chooserIntent, REQUEST_TAKE_PHOTO); 
     } 
    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == RESULT_OK) { 
      if (requestCode == REQUEST_TAKE_PHOTO) { 
       final boolean isCamera; 
       if (data == null) { 
        isCamera = true; 
       } else { 
        final String action = data.getAction(); 
        if (action == null) { 
         isCamera = false; 
        } else { 
         isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
        } 
       } 
       Uri selectedImageUri; 
       if (isCamera) { 
        selectedImageUri = outputFileUri; 
       } else { 
        selectedImageUri = data == null ? null : data.getData(); 
       } 
       // mainView.setImageURI(selectedImageUri); 
       // Log.d("Before adding", selectedImageUri.toString()); 
       happyList.add(selectedImageUri); 
      } 
     } 
    } 
+0

Können Sie Ihren Code zusammen mit dem Logcat für die NPE veröffentlichen? –

+2

Speichern Sie Ihre Daten in ** onSaveInstanceState() ** und stellen Sie Ihre Daten in ** onRestoreInstanceState() ** wieder her. Weitere Informationen finden Sie hier https://developer.android.com/training/basics/activity-lifecycle/recreating.html –

+0

@MehrajMalik Ich verstehe die Konzepte (meistens), aber ich bin mir nicht sicher, wie ich meine ArrayList "speichern" und stelle es wieder her – rafvasq

Antwort

1

speichern Ihre Daten in onSaveInstanceState()

@Override 
public void onSaveInstanceState (Bundle outState) { 
    // TODO Auto-generated method stub 
    super.onSaveInstanceState(outState); 
    outState.putSerializable("array", arrayDetails); 
} 

setzen diese Zeilen Code in OnCreate() -Methode Ihrer Aktivität auf Arraylist Orientierungsänderung zu erhalten.

if (savedInstanceState != null) { 
     arrayDetails = (ArrayList<yourListType>)savedInstanceState.getSerializable("array"); 
} 
+0

Was ist ArrayDetails in dieser Situation? Muss ich ein onResume machen? – rafvasq

+0

'ArrayDetails' ist ArrayList , die Sie auf dem Bildschirm speichern möchten, drehen. – user392117

1
ArrayList<URI> uris = .. 
//inStop of your application 
SharedPreference sp = context.getSharePreference("imagineThis",0); 
SharedPreference.Editor ed = sp.edit(); 
byte i =0; 
for(Uri u : uris){ i++; 
    ed.put(String.valueOf(i), u.toString());} 
ed.commit(); 
//in onrestart of your app 
uris.clear();//provided is not null; 
SharedPreference sp = context.getSharePreference("imagineThis",0); 
SharedPreference.Editor ed = sp.edit(); 
for(String s : ((Map<String,String>)sp.getAll()).values()){ 
    uris.add(Uri.parse(s)); 
} 
ed.clear(); 
ed.commit(); 

Ich glaube, Sie sind gut jetzt

+1

ed ist schlecht benannt, :) – David

1

Hey können Sie einfach onRetainNonConfigurationInstance in Ihrer Aktivität außer Kraft setzen und das Rück Ihre Arraylist-Objekt und in Ihrem onCreate() Methode überprüfen, ob Ihr Objekt null ist oder nicht, wenn seine Null Verwendung getLastNonConfigurationInstance(), um das Objekt

//PseudoCode 
onRetainNonConfigurationInstance() { 

return arraylistObject; 

} 

oncreate(Bundle onSavedInstance){ 

if(arraylistObject == null){ 

arraylistObject = (cast properly)getLastNonConfigurationInstance(); 

} 

} 

das ist einfachste abzurufen aber Fragment verwendet Zustand zu speichern über Dreh empfohlen

Verwandte Themen