我在使用 Bundle 和 ArrayList 的 android studio 中遇到错误
I have an error in android studio with Bundle and ArrayList
这是我的代码片段。
'''
捆绑包 b= 新捆绑包 ();
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
adapter= new PlatformAdapter(data);
recyclerView=view.findViewById(R.id.recyclerView);
recyclerView.setLayoutManager( new LinearLayoutManager(getContext()));
recyclerView.setAdapter(adapter);
RequestVolley.getInstance(getContext())
.doGetRequest("http://www...... .json", new RequestVolley.OnCompleteCallback() {
@Override
public void onCompleted(String response) {
try {
JSONArray jsonArray = new JSONArray(response);
for(int i=0;i<jsonArray.length();i++){
JSONObject object= jsonArray.optJSONObject(i);
if(object!=null){
data.add(Platform.parseJSON(object));
}
}
adapter.notifyDataSetChanged();
}catch(JSONException e){
e.printStackTrace();
}
}
});
b.putSerializable("ListPlatforms", (Serializable) data);
}
然后,我尝试在另一个片段中这样做:
'''
@Override
public void onLocationChanged(@NonNull Location location) {
if (googleMap != null) {
if (myMarker == null) {
MarkerOptions options = new MarkerOptions();
options.title("My location");
options.position(new LatLng(location.getLatitude(), location.getLongitude()));
myMarker = googleMap.addMarker(options);
googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 10f));
} else {
myMarker.setPosition(new LatLng(location.getLatitude(), location.getLongitude()));
}
}
Bundle b=new Bundle ();
ArrayList<Platform> platforms= (ArrayList<Platform>) b.getSerializable("ListPlatforms");
for(Platform platform:platforms) {
double latitudine = platform.getClatitudine__wgs84__();
double longitudine = platform.getClongitudine__wgs_84__();
double distance = getDistanceinKm(latitudine, longitudine, location.getLatitude(), location.getLongitude());
if (distance >=0.0) {
MarkerOptions options = new MarkerOptions();
options.title(platform.getCdenominazione__());
options.position(new LatLng(latitudine, longitudine));
myMarker = googleMap.addMarker(options);
}
}
}
'''
但是我有 java.lang.NullPointerException: 当我尝试执行“for(Platform platform:platforms)”.. null 中的平台时,尝试在空对象引用错误上调用虚拟方法 'java.util.Iterator java.util.ArrayList.iterator()'。 .. 为什么??
因为你没有分享你如何在片段之间导航,我假设你正在使用带动作的导航图。
因此,如果我们假设这是您的代码,则从片段 A 导航到片段 B
NavHostFragment.findNavController(FragA.this)
.navigate(R.id.action_FragA_FragB); //navigate from FragA to FragB action
- 然后你应该像这样在导航代码中将你使用
b.putSerializable("ListPlatforms", (Serializable) data);
的包作为第二个参数传递给导航代码(注意我现在将 b 作为第二个参数包含在方法中) :
NavHostFragment.findNavController(FragA.this)
.navigate(R.id.action_FragA_FragB,b); //navigate from FragA to FragB action
- 然后在第二个片段中,您应该使用
getArguments()
方法获取此 b 包,该方法可以从片段中的任何位置调用。
Bundle FragA_b = getArguments();
ArrayList<Platform> platforms= (ArrayList<Platform>) FragA_b.getSerializable("ListPlatforms");
N.B :不要与在 OnCreate
,onViewCreated
,[ 中作为参数发送的 savedInstanceState 包混淆=17=] 和 onSaveState
生命周期片段方法,这些 savedInstanceState 包与您在导航期间发送并使用 getArguments()
方法获取的包无关。
这是我的代码片段。
'''
捆绑包 b= 新捆绑包 ();
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
adapter= new PlatformAdapter(data);
recyclerView=view.findViewById(R.id.recyclerView);
recyclerView.setLayoutManager( new LinearLayoutManager(getContext()));
recyclerView.setAdapter(adapter);
RequestVolley.getInstance(getContext())
.doGetRequest("http://www...... .json", new RequestVolley.OnCompleteCallback() {
@Override
public void onCompleted(String response) {
try {
JSONArray jsonArray = new JSONArray(response);
for(int i=0;i<jsonArray.length();i++){
JSONObject object= jsonArray.optJSONObject(i);
if(object!=null){
data.add(Platform.parseJSON(object));
}
}
adapter.notifyDataSetChanged();
}catch(JSONException e){
e.printStackTrace();
}
}
});
b.putSerializable("ListPlatforms", (Serializable) data);
}
然后,我尝试在另一个片段中这样做: '''
@Override
public void onLocationChanged(@NonNull Location location) {
if (googleMap != null) {
if (myMarker == null) {
MarkerOptions options = new MarkerOptions();
options.title("My location");
options.position(new LatLng(location.getLatitude(), location.getLongitude()));
myMarker = googleMap.addMarker(options);
googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 10f));
} else {
myMarker.setPosition(new LatLng(location.getLatitude(), location.getLongitude()));
}
}
Bundle b=new Bundle ();
ArrayList<Platform> platforms= (ArrayList<Platform>) b.getSerializable("ListPlatforms");
for(Platform platform:platforms) {
double latitudine = platform.getClatitudine__wgs84__();
double longitudine = platform.getClongitudine__wgs_84__();
double distance = getDistanceinKm(latitudine, longitudine, location.getLatitude(), location.getLongitude());
if (distance >=0.0) {
MarkerOptions options = new MarkerOptions();
options.title(platform.getCdenominazione__());
options.position(new LatLng(latitudine, longitudine));
myMarker = googleMap.addMarker(options);
}
}
} ''' 但是我有 java.lang.NullPointerException: 当我尝试执行“for(Platform platform:platforms)”.. null 中的平台时,尝试在空对象引用错误上调用虚拟方法 'java.util.Iterator java.util.ArrayList.iterator()'。 .. 为什么??
因为你没有分享你如何在片段之间导航,我假设你正在使用带动作的导航图。
因此,如果我们假设这是您的代码,则从片段 A 导航到片段 B
NavHostFragment.findNavController(FragA.this)
.navigate(R.id.action_FragA_FragB); //navigate from FragA to FragB action
- 然后你应该像这样在导航代码中将你使用
b.putSerializable("ListPlatforms", (Serializable) data);
的包作为第二个参数传递给导航代码(注意我现在将 b 作为第二个参数包含在方法中) :
NavHostFragment.findNavController(FragA.this)
.navigate(R.id.action_FragA_FragB,b); //navigate from FragA to FragB action
- 然后在第二个片段中,您应该使用
getArguments()
方法获取此 b 包,该方法可以从片段中的任何位置调用。
Bundle FragA_b = getArguments();
ArrayList<Platform> platforms= (ArrayList<Platform>) FragA_b.getSerializable("ListPlatforms");
N.B :不要与在 OnCreate
,onViewCreated
,[ 中作为参数发送的 savedInstanceState 包混淆=17=] 和 onSaveState
生命周期片段方法,这些 savedInstanceState 包与您在导航期间发送并使用 getArguments()
方法获取的包无关。