Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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 我得到一个空指针异常,但我没有';我不知道为什么,假定保存的图形赢了';t载荷_Java_Android_Android Studio - Fatal编程技术网

Java 我得到一个空指针异常,但我没有';我不知道为什么,假定保存的图形赢了';t载荷

Java 我得到一个空指针异常,但我没有';我不知道为什么,假定保存的图形赢了';t载荷,java,android,android-studio,Java,Android,Android Studio,我正在构建一个有多个片段的应用程序,其中大约一半的片段包含一个自定义视图,用户可以用手指画线(我们称之为画布),在我向主应用程序添加新代码之前,我正在使用一个测试应用程序。我试图做的是保存用户绘制的线条,然后用户将片段留给另一个片段,并在该片段的画布上绘制一些线条,然后可以返回到前一个片段(第二个片段的绘图将被保存),其中该片段的绘图只会显示在画布中。如果用户返回到第二个片段,则只会显示第二个片段的图形,并且当应用程序关闭时,图形应该仍然存在。我正在使用SharedReferences 当我转到

我正在构建一个有多个片段的应用程序,其中大约一半的片段包含一个自定义视图,用户可以用手指画线(我们称之为画布),在我向主应用程序添加新代码之前,我正在使用一个测试应用程序。我试图做的是保存用户绘制的线条,然后用户将片段留给另一个片段,并在该片段的画布上绘制一些线条,然后可以返回到前一个片段(第二个片段的绘图将被保存),其中该片段的绘图只会显示在画布中。如果用户返回到第二个片段,则只会显示第二个片段的图形,并且当应用程序关闭时,图形应该仍然存在。我正在使用SharedReferences

当我转到一个片段(LineLHwFragment)时,我可以在画布上绘制并单击save(我将显示代码中的位置),它将显示“Data saved”。如果我关闭应用程序并再次加载,然后转到该片段,则不会加载图形

此外,如果我在单击第一个片段后或首先转到另一个片段(ChatFragment),应用程序将崩溃,我会收到以下错误消息:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.Iterator java.util.ArrayList.iterator()' on a null object reference
    at com.josullivan.mytestapplication.PaintView.onDraw(PaintView.java:112)
我不确定它为什么不加载图形或为什么崩溃

LineLHwFragment

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;

public class LineLHwFragment extends Fragment {

private PaintView paintView;
public ArrayList test;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable 
Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_line_l_hw, container, false);
        paintView = v.findViewById(R.id.lineLPaintView);

        //This should get the drawing to load
        loadData();

       

    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    paintView.init(metrics);
    setHasOptionsMenu(true);
        return v;

}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.normal:
            paintView.normal();
            //this is where the saving should happen when clicked
            saveData();
            return true;

        case R.id.clear:
            paintView.clear();
            return true;
    }

    return super.onOptionsItemSelected(item);
}

private void saveData() {
    SharedPreferences sharedPreferences = this.getActivity().getSharedPreferences("line test 1", 
Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    Gson gson = new Gson();
    String json = gson.toJson(paintView.getPaths());
    editor.putString("line test", json);
    editor.apply();
    Toast.makeText(this.getActivity(), "Data saved", Toast.LENGTH_SHORT).show();
}

private void loadData() {
    SharedPreferences sharedPreferences = this.getActivity().getSharedPreferences("line test 1", 
Context.MODE_PRIVATE);
    Gson gson = new Gson();
    String json = sharedPreferences.getString("line test", null);
    Type type = new TypeToken<ArrayList<FingerPath>>() {}.getType();
   test = paintView.getPaths();
    test = gson.fromJson(json, type);
    paintView.setPaths(test);
}



}
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;


public class ChatFragment extends Fragment {

private PaintView paintView;
public ArrayList test;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable 
Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_chat, container, false);
        paintView = v.findViewById(R.id.paintView1);
        loadData();

       

    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    paintView.init(metrics);
    setHasOptionsMenu(true);
        return v;

}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.normal:
            paintView.normal();
            saveData();
            return true;

        case R.id.clear:
            paintView.clear();
            return true;
    }

    return super.onOptionsItemSelected(item);
}

private void saveData() {
    SharedPreferences sharedPreferences = this.getActivity().getSharedPreferences("chat test 1", 
Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    Gson gson = new Gson();
    String json = gson.toJson(paintView.getPaths());
    editor.putString("chat test", json);
    editor.apply();
    Toast.makeText(this.getActivity(), "Data saved", Toast.LENGTH_SHORT).show();
}

private void loadData() {
    SharedPreferences sharedPreferences = this.getActivity().getSharedPreferences("chat test 1", 
Context.MODE_PRIVATE);
    Gson gson = new Gson();
    String json = sharedPreferences.getString("chat test", null);
    Type type = new TypeToken<ArrayList<FingerPath>>() {}.getType();
    test = paintView.getPaths();
    test = gson.fromJson(json, type);
    paintView.setPaths(test);

}


}
导入android.content.Context;
导入android.content.SharedReferences;
导入android.os.Bundle;
导入android.util.DisplayMetrics;
导入android.view.LayoutInflater;
导入android.view.Menu;
导入android.view.MenuInflater;
导入android.view.MenuItem;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.Toast;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.fragment.app.fragment;
导入com.google.gson.gson;
导入com.google.gson.reflect.TypeToken;
导入java.lang.reflect.Type;
导入java.util.ArrayList;
公共类LineLHwFragment扩展了片段{
私人画景画景;
公共阵列列表测试;
@可空
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater,@Nullable ViewGroup container,@Nullable
Bundle savedInstanceState){
视图v=充气机。充气(右布局。碎片线,容器,假);
paintView=v.findviewbyd(R.id.linelpainview);
//这样可以加载图形
loadData();
DisplayMetrics=新的DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(度量);
paintView.init(度量);
设置选项菜单(真);
返回v;
}
@凌驾
创建选项菜单(菜单菜单,菜单充气机){
充气机。充气(右菜单。主菜单,菜单);
super.onCreateOptions菜单(菜单,充气机);
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
开关(item.getItemId()){
病例R.id.normal:
paintView.normal();
//单击时应在此处进行保存
saveData();
返回true;
案例R.id.clear:
paintView.clear();
返回true;
}
返回super.onOptionsItemSelected(项目);
}
私有void saveData(){
SharedReferences SharedReferences=this.getActivity().getSharedReferences(“行测试1”,
上下文。模式(私人);
SharedReferences.Editor=SharedReferences.edit();
Gson Gson=新的Gson();
字符串json=gson.toJson(paintView.getpath());
putString(“行测试”,json);
editor.apply();
Toast.makeText(this.getActivity(),“数据已保存”,Toast.LENGTH_SHORT.show();
}
私有void loadData(){
SharedReferences SharedReferences=this.getActivity().getSharedReferences(“行测试1”,
上下文。模式(私人);
Gson Gson=新的Gson();
String json=SharedReferences.getString(“行测试”,null);
Type Type=new-TypeToken(){}.getType();
test=paintView.getpath();
test=gson.fromJson(json,类型);
paintView.setpath(测试);
}
}
聊天片段

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;

public class LineLHwFragment extends Fragment {

private PaintView paintView;
public ArrayList test;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable 
Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_line_l_hw, container, false);
        paintView = v.findViewById(R.id.lineLPaintView);

        //This should get the drawing to load
        loadData();

       

    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    paintView.init(metrics);
    setHasOptionsMenu(true);
        return v;

}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.normal:
            paintView.normal();
            //this is where the saving should happen when clicked
            saveData();
            return true;

        case R.id.clear:
            paintView.clear();
            return true;
    }

    return super.onOptionsItemSelected(item);
}

private void saveData() {
    SharedPreferences sharedPreferences = this.getActivity().getSharedPreferences("line test 1", 
Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    Gson gson = new Gson();
    String json = gson.toJson(paintView.getPaths());
    editor.putString("line test", json);
    editor.apply();
    Toast.makeText(this.getActivity(), "Data saved", Toast.LENGTH_SHORT).show();
}

private void loadData() {
    SharedPreferences sharedPreferences = this.getActivity().getSharedPreferences("line test 1", 
Context.MODE_PRIVATE);
    Gson gson = new Gson();
    String json = sharedPreferences.getString("line test", null);
    Type type = new TypeToken<ArrayList<FingerPath>>() {}.getType();
   test = paintView.getPaths();
    test = gson.fromJson(json, type);
    paintView.setPaths(test);
}



}
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;


public class ChatFragment extends Fragment {

private PaintView paintView;
public ArrayList test;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable 
Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_chat, container, false);
        paintView = v.findViewById(R.id.paintView1);
        loadData();

       

    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    paintView.init(metrics);
    setHasOptionsMenu(true);
        return v;

}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.normal:
            paintView.normal();
            saveData();
            return true;

        case R.id.clear:
            paintView.clear();
            return true;
    }

    return super.onOptionsItemSelected(item);
}

private void saveData() {
    SharedPreferences sharedPreferences = this.getActivity().getSharedPreferences("chat test 1", 
Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    Gson gson = new Gson();
    String json = gson.toJson(paintView.getPaths());
    editor.putString("chat test", json);
    editor.apply();
    Toast.makeText(this.getActivity(), "Data saved", Toast.LENGTH_SHORT).show();
}

private void loadData() {
    SharedPreferences sharedPreferences = this.getActivity().getSharedPreferences("chat test 1", 
Context.MODE_PRIVATE);
    Gson gson = new Gson();
    String json = sharedPreferences.getString("chat test", null);
    Type type = new TypeToken<ArrayList<FingerPath>>() {}.getType();
    test = paintView.getPaths();
    test = gson.fromJson(json, type);
    paintView.setPaths(test);

}


}
导入android.content.Context;
导入android.content.SharedReferences;
导入android.os.Bundle;
导入android.util.DisplayMetrics;
导入android.view.LayoutInflater;
导入android.view.Menu;
导入android.view.MenuInflater;
导入android.view.MenuItem;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.Toast;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.fragment.app.fragment;
导入com.google.gson.gson;
导入com.google.gson.reflect.TypeToken;
导入java.lang.reflect.Type;
导入java.util.ArrayList;
公共类ChatFragment扩展了片段{
私人画景画景;
公共阵列列表测试;
@可空
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater,@Nullable ViewGroup container,@Nullable
Bundle savedInstanceState){
视图v=充气机。充气(R.layout.fragment\u chat,容器,false);
paintView=v.findviewbyd(R.id.paintView 1);
loadData();
DisplayMetrics=新的DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(度量);
paintView.init(度量);
设置选项菜单(真);
返回v;
}
@凌驾
创建选项菜单(菜单菜单,菜单充气机){
充气机。充气(右菜单。主菜单,菜单);
super.onCreateOptions菜单(菜单,充气机);
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
开关(item.getItemId()){
病例R.id.normal:
paintView.normal();
saveData();
返回true;
案例R.id.clear:
paintView.clear();
返回true;
}
返回super.onOptionsItemSelected(项目);
}
私有void saveData(){
SharedReferences SharedReferences=this.getActivity().getSharedReferences(“聊天测试1”,
上下文。模式(私人);
SharedReferences.Editor=SharedReferences