2016-08-05 5 views
1

私はイメージを繰り返し処理し、毎回1つのImageViewを更新できるようにするために使用するURIのArrayListを持っています。私はこれに近づくとNullPointerExceptionを取得し、前述の画像を撮影するときにカメラが画面を回転させる(アクティビティを破棄する)ことと関係していると考えています。ArrayList <Uri>を画面に保存するにはどうすればいいですか?

これは、onSaveInstanceStateとonResume--ではどのように見えますか?

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) 

ライン124は、次のとおりです。

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

マイdispatchTakePictureIntentが二度カメラやギャラリーを要求します(最初のループを参照してください)。 OnActivityResultはURIを受け取り、それをhappyList(onCreateでインスタンス化されたもの)に追加します。

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

NPEのlogcatと共にコードを投稿できますか? –

+2

** onSaveInstanceState()**にデータを格納し、** onRestoreInstanceState()**にデータを復元します。詳細はこちらhttps://developer.android.com/training/basics/activity-lifecycle/recreating.html –

+0

@MehrajMalik私はコンセプトを(ほとんど)理解していますが、私はArrayListを '保存'する方法がわかりませんそれを復元する – rafvasq

答えて

1

店はonSaveInstanceStateであなたのデータは、()

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

はオリエンテーションの変更についてのArrayListを得るためにあなたの活動のOnCreate関数に()メソッドをこれらのコード行を置きます。

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

この状況ではarrayDetailsとは何ですか? onResumeを作成する必要はありますか? – rafvasq

+0

'arrayDetails'は画面上に保存したいArrayList です。 – 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(); 

は、私はあなたがいると思うの良い今

+1

ed :) – David

1

ねえあなたは、単にあなたの活動にonRetainNonConfigurationInstanceをオーバーライドして、オブジェクトがnullであるかないかの場合は、あなたのArrayListオブジェクトとあなたのonCreate()メソッドのチェックにを返すことができますこれは最も簡単なものですが、回転間で状態を保存するためにフラグメントを使用したオブジェクトに

//PseudoCode 
onRetainNonConfigurationInstance() { 

return arraylistObject; 

} 

oncreate(Bundle onSavedInstance){ 

if(arraylistObject == null){ 

arraylistObject = (cast properly)getLastNonConfigurationInstance(); 

} 

} 

を取得するために、そのヌル利用getLastNonConfigurationInstance()は推奨されます

関連する問題