如何从Android中的MainActivity传递位置类型ArrayList到MapsActivity?

时间:2017-09-10 18:35:38

标签: android android-intent arraylist location

我尝试做的是将地点列表传递给地图活动并将标记放在这些位置上。我尝试过使用MainActivity

public class MainActivity extends AppCompatActivity implements Parcelable {

ArrayList<Location> locs=new ArrayList<>();
...
locs.add(location);
...
Intent in = new Intent(context,MapsActivity.class);
in.putExtra("setlocations",locs);
startActivity(in);
...
 @Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeList(locs);

}
}

然后在MapsActivity&#39; onCreate()

 Bundle extras = getIntent().getExtras();
    if(extras != null){
        locs=(ArrayList<Location>)getIntent().getParcelableExtra("setlocations");
        addMarkeratLocation();
    }

addMarkeratLocation()方法使用locs列表使用for循环

添加标记
public void addMarkeratLocation(){
    BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.mipmap.dott);
    LatLng addpoint=new LatLng(0.0,0.0);
    for(int i=0;i<locs.size();i++){
        addpoint = new LatLng(locs.get(i).getLatitude(), locs.get(i).getLongitude());
        mMap.addMarker(new MarkerOptions().position(addpoint).icon(icon));
     }
    mMap.moveCamera(CameraUpdateFactory.newLatLng(addpoint));
}

我的应用程序在触发意图时崩溃。而logcat显示 java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference 为何显示null?这是我第一次使用Parcelable界面。我有什么遗漏吗?任何意见都将不胜感激,谢谢。

3 个答案:

答案 0 :(得分:5)

`Location` class is not a Parcalable class.

Intent.putExtra()函数只接受原始和Parcelable数据类型。因此,您无法通过意图传递List<Location>。相反,您可以使用Gson库来序列化Location的arraylist,并将其作为Json字符串传递给MapActivity,并将MapActivity反序列化为Json字符串到Location数组。

答案 1 :(得分:4)

步骤1:首先使用Gradle脚本导入Gson库

在Gradle依赖项中添加此行

dependencies {
    compile 'com.google.code.gson:gson:2.7'
}

步骤2:将List转换为JSON字符串并将JSON字符串从MainActivity传递给MapsActivity

        Location location1 = new Location("");
        location1.setLatitude(12.124);
        location1.setLongitude(77.124);
        Location location2 = new Location("");
        location2.setLatitude(12.765);
        location2.setLatitude(77.8965);

        List<Location> locations = new ArrayList<Location>();
        locations.add(location1);
        locations.add(location2);

        Gson gson = new Gson();
        String jsonString = gson.toJson(locations);
        Intent intent = new Intent(MainActivity.this,MapsActivity.class);
        intent.putExtra("KEY_LOCATIONS",jsonString);
        startActivity(intent);

步骤3:从Bundle获取JSON字符串并将其转换为List

        Bundle bundle = getIntent().getExtras();
        String jsonString = bundle.getString("KEY_LOCATIONS");

        Gson gson = new Gson();
        Type listOfLocationType = new TypeToken<List<Location>>() {}.getType();
        List<Location> locations = gson.fromJson(jsonString,listOfLocationType );

我希望这可以帮到你!!

答案 2 :(得分:0)

ArrayList locs = new ArrayList&lt;&gt;(); 应该使用Parcelable实现位置类,您已经实现了Parcelable,但它适用于Location类的活动。

请参阅以下链接,了解与您的查询相关的更多信息。

Passing arraylist of custom object to another activity