Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 保存和恢复ArrayList_Java_Android - Fatal编程技术网

Java 保存和恢复ArrayList

Java 保存和恢复ArrayList,java,android,Java,Android,我的应用程序拍摄两张图片,并将每个URI放入ArrayList中,这样我就可以从单个ImageView中对其进行迭代。我知道URI正在正常工作并被添加到ArrayList中。我假设活动在屏幕上消失,相机旋转(拍摄前面提到的图像),所以我使用onSaveInstanceState保存我想要使用的数据。在我这么做之前,应用程序会在拍照后立即崩溃。现在没有了,但是当我试图从列表中设置image时,我得到了一个空指针。我做错什么了吗 日志: FATAL EXCEPTION: main

我的应用程序拍摄两张图片,并将每个URI放入ArrayList中,这样我就可以从单个ImageView中对其进行迭代。我知道URI正在正常工作并被添加到ArrayList中。我假设活动在屏幕上消失,相机旋转(拍摄前面提到的图像),所以我使用onSaveInstanceState保存我想要使用的数据。在我这么做之前,应用程序会在拍照后立即崩溃。现在没有了,但是当我试图从列表中设置image时,我得到了一个空指针。我做错什么了吗

日志:

FATAL EXCEPTION: main
                                                                              Process: my.package.myapplication, PID: 15047
                                                                              java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageURI(android.net.Uri)' on a null object reference
                                                                                  at my.package.myapplication.Person1Screen$5.onClick(Person1Screen.java:130)
                                                                                  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)
我在以下内容底部的setImageURI中获得空指针:

happy = (Button) findViewById(R.id.happy_btn);
happy.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view){
            id = HAPPY;
            if(toggled){
                //picture mode
                dispatchTakePictureIntent();
            }
            else if(!toggled) {
                //display mode
                //happyIndex = 0;
                mainView.setImageURI(happyList.get(0)); // LINE 130
            }
        }
    });
我的onCreate中包含以下内容:

happyList = new ArrayList<>();
    if (savedInstanceState != null) {
        happyList = savedInstanceState.getParcelableArrayList(HAPPY_LIST);
    }
My TakePictureContent(从照相机或多媒体资料中拍摄两张照片)和onActivityResult(拍摄URI并添加到列表中):

private void dispatchTakePictureContent(){
pictureCounter=-1;
对于(int i=0;i<2;i++){
pictureCounter++;
Intent takePictureIntent=新的意图(MediaStore.ACTION\u IMAGE\u CAPTURE);
if(takePictureContent.resolveActivity(getPackageManager())!=null){
//创建照片应该放在哪里的文件
文件photoFile=null;
试一试{
photoFile=createImageFile();
outputFileUri=Uri.fromFile(photoFile);
}捕获(IOEX异常){
Log.w(“错误”、“IOException”);
}捕获(NullPointerException nullEx){
w(“错误”、“NullPointerException”);
}
//照相机。
最终列表cameraIntents=newarraylist();
最终意图捕获意图=新意图(android.provider.MediaStore.ACTION\u IMAGE\u CAPTURE);
最终PackageManager PackageManager=getPackageManager();
最终列表listCam=packageManager.QueryInputActivities(captureIntent,0);
用于(ResolveInfo res:listCam){
最后一个字符串packageName=res.activityInfo.packageName;
最终意图=新意图(captureIntent);
setComponent(新组件名(res.activityInfo.packageName,res.activityInfo.name));
intent.setPackage(packageName);
intent.putExtra(MediaStore.EXTRA_输出,Uri.fromFile(photoFile));
添加(意图);
}
//文件系统。
最终意图GalleryContent=新意图();
GalleryContent.setType(“image/*”);
GalleryContent.setAction(Intent.ACTION\u GET\u CONTENT);
//选择文件系统选项。
最终意图选择器content=Intent.createChooser(GalleryContent,“选择源”);
//添加相机选项。
选择content.putExtra(Intent.EXTRA\u INITIAL\u INTENTS,cameraIntents.toArray(新包裹[cameraIntents.size()]);
startActivityForResult(选择内容、要求拍照);
}
}
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
if(resultCode==RESULT\u OK){
if(requestCode==请求拍照){
最终布尔isCamera;
如果(数据==null){
isCamera=真;
}否则{
最后一个字符串action=data.getAction();
if(action==null){
isCamera=假;
}否则{
isCamera=action.equals(android.provider.MediaStore.action\u IMAGE\u CAPTURE);
}
}
Uri选择图像Uri;
如果(isCamera){
选择edimageri=outputFileUri;
}否则{
selectedImageUri=data==null?null:data.getData();
}
//mainView.setImageURI(selectedImageUri);
//Log.d(“添加前”,选择edimageri.toString());
添加(selectedImageUri);
//Log.d(“数组:,happyList.toString());
}
}
}
在onSavedInstanceState()方法中,您将if条件中的键设置为“happylist”,将“array”更改为“happylist”

if(savedInstanceState!=null){
happyList=(ArrayList)savedInstanceState.getSerializable(“happyList”);
}
在onSavedInstanceState()方法中,您将if条件中的键设置为“happylist”,将“array”更改为“happylist”

if(savedInstanceState!=null){
happyList=(ArrayList)savedInstanceState.getSerializable(“happyList”);
}

首先,建议您在类中存储一个键常量。主要原因是为了保持一致,避免打字错误

public static final String HAPPY_LIST = "happyList";
现在,在保存和恢复时使用它

其次,我认为这些应该被翻转,因为你想把你保存的东西放进去,然后做超级调用所做的任何事情

此外,Uri对象是可分包的,因此请为此使用适当的方法

@Override
public void onSaveInstanceState (Bundle savedInstanceState) {
    savedInstanceState.putParcelableArrayList(HAPPY_LIST, happyList);
    super.onSaveInstanceState(savedInstanceState);
}

最后,您可以在onRestoreInstanceState或onCreate中使用已还原的捆绑包,但我认为您不需要同时使用这两种方式

首先,建议您在类中存储一个键常量。主要原因是为了保持一致,避免打字错误

public static final String HAPPY_LIST = "happyList";
现在,在保存和恢复时使用它

其次,我认为这些应该被翻转,因为你想把你保存的东西放进去,然后做超级调用所做的任何事情

此外,Uri对象是可分包的,因此请为此使用适当的方法

@Override
public void onSaveInstanceState (Bundle savedInstanceState) {
    savedInstanceState.putParcelableArrayList(HAPPY_LIST, happyList);
    super.onSaveInstanceState(savedInstanceState);
}

最后,您可以在onRestoreInstanceState或onCreate中使用已还原的捆绑包,但我认为您不需要同时使用这两种方式

没有理由重写OnResolReinstanceState,并且您在onCreate中使用了不同的名称。@muratgu我在更新的代码中遇到了同样的问题。我在我的帖子中对我现在拥有的内容进行了更改。那么,也许happyList是空的?为什么我们要假设它至少有一个元素?@muratgu我调试并打印了它
@Override
public void onSaveInstanceState (Bundle savedInstanceState) {
    savedInstanceState.putParcelableArrayList(HAPPY_LIST, happyList);
    super.onSaveInstanceState(savedInstanceState);
}