Java 我得到一个空指针异常,但我没有';我不知道为什么,假定保存的图形赢了';t载荷
我正在构建一个有多个片段的应用程序,其中大约一半的片段包含一个自定义视图,用户可以用手指画线(我们称之为画布),在我向主应用程序添加新代码之前,我正在使用一个测试应用程序。我试图做的是保存用户绘制的线条,然后用户将片段留给另一个片段,并在该片段的画布上绘制一些线条,然后可以返回到前一个片段(第二个片段的绘图将被保存),其中该片段的绘图只会显示在画布中。如果用户返回到第二个片段,则只会显示第二个片段的图形,并且当应用程序关闭时,图形应该仍然存在。我正在使用SharedReferences 当我转到一个片段(LineLHwFragment)时,我可以在画布上绘制并单击save(我将显示代码中的位置),它将显示“Data saved”。如果我关闭应用程序并再次加载,然后转到该片段,则不会加载图形 此外,如果我在单击第一个片段后或首先转到另一个片段(ChatFragment),应用程序将崩溃,我会收到以下错误消息:Java 我得到一个空指针异常,但我没有';我不知道为什么,假定保存的图形赢了';t载荷,java,android,android-studio,Java,Android,Android Studio,我正在构建一个有多个片段的应用程序,其中大约一半的片段包含一个自定义视图,用户可以用手指画线(我们称之为画布),在我向主应用程序添加新代码之前,我正在使用一个测试应用程序。我试图做的是保存用户绘制的线条,然后用户将片段留给另一个片段,并在该片段的画布上绘制一些线条,然后可以返回到前一个片段(第二个片段的绘图将被保存),其中该片段的绘图只会显示在画布中。如果用户返回到第二个片段,则只会显示第二个片段的图形,并且当应用程序关闭时,图形应该仍然存在。我正在使用SharedReferences 当我转到
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