【发布时间】:2020-03-25 02:50:30
【问题描述】:
我正在尝试在地图上绘制折线
导入 com.google.android.gms.maps.model.Polyline; 导入 com.google.android.gms.maps.model.PolylineOptions;
导入 java.util.ArrayList; 导入 java.util.List;
公共类 MainActivity 扩展 AppCompatActivity 实现 OnMapReadyCallback、SeekBar.OnSeekBarChangeListener { //初始化变量
GoogleMap gMap;
SeekBar seekWidth, seekBlue, seekGreen, seekRed;
Button btClear, btDraw;
Polyline polyline = null;
List<LatLng> latLngList = new ArrayList<>();
List<Marker> markerList = new ArrayList<>();
PolylineOptions polylineOptions = null;
int red = 0, green= 0, blue=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Assign variable
seekWidth = findViewById(R.id.seek_width);
seekRed = findViewById(R.id.seek_red);
seekGreen = findViewById(R.id.seek_green);
seekBlue = findViewById(R.id.seek_blue);
btDraw=findViewById(R.id.bt_draw);
btClear=findViewById(R.id.bt_clear);
/*Initialise SupportMapFragment
SupportMapFragment supportMapFragment = (SupportMapFragment)getSupportFragmentManager()
.findFragmentById(R.id.google_map);
supportMapFragment.getMapAsync(this);
btDraw.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Draw Polyline on Map
if (polyline!=null) polyline.remove();
//Create PolylineOptions
PolylineOptions polylineOptions = new PolylineOptions()
.addAll(latLngList).clickable(true);
polyline = gMap.addPolyline(polylineOptions);
setWidth();
}
});*/
//Initialise SupportMapFragment
SupportMapFragment supportMapFragment = (SupportMapFragment)getSupportFragmentManager()
.findFragmentById(R.id.google_map);
supportMapFragment.getMapAsync(this);
btDraw.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Draw Polyline on Map
if (polyline!=null) polyline.remove();
if(polylineOptions!=null){
//Create PolylineOptions
polyline = gMap.addPolyline(polylineOptions);
setWidth();
}
}
});
btClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Clear All
if (polyline!=null) polyline.remove();
for(Marker marker: markerList) marker.remove();
latLngList.clear();
markerList.clear();
seekWidth.setProgress(3);
seekBlue.setProgress(0);
seekGreen.setProgress(0);
seekRed.setProgress(0);
}
});
seekRed.setOnSeekBarChangeListener(this);
seekGreen.setOnSeekBarChangeListener(this);
seekBlue.setOnSeekBarChangeListener(this);
}
private void setWidth() {
seekWidth.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//Get Seekbar Progress
int width = seekWidth.getProgress();
if (polyline != null) {
//Set Polyline Width
polyline.setWidth(width);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
/*@Override
public void onMapReady(GoogleMap googleMap) {
/*gMap= googleMap;
gMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
//Create MarkerOptions
MarkerOptions markerOptions = new MarkerOptions().position(latLng);
//Create Marker
Marker marker = gMap.addMarker(markerOptions);
//Add Latlng and Marker
latLngList.add(latLng);
markerList.add(marker);
}
});
}*/
public void onMapReady(GoogleMap googleMap) {
gMap= googleMap;
gMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
//Create MarkerOptions
MarkerOptions markerOptions = new MarkerOptions().position(latLng);
//Create Marker
Marker marker = gMap.addMarker(markerOptions);
//Add Latlng and Marker
latLngList.add(latLng);
markerList.add(marker);
polylineOptions = new PolylineOptions().addAll(latLngList).clickable(true);
}
});
}
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
switch (seekBar.getId()){
case R.id.seek_red:
red = i;
break;
case R.id.seek_green:
green = i;
break;
case R.id.seek_blue:
blue= i;
break;
}
if(polyline !=null){
//Set Polyline Color
polyline.setColor(Color.rgb(red,green,blue));
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
}
错误如下:
2019-11-29 13:39:40.391 20694-20694/com.example.poly E/AndroidRuntime: 致命例外:主要 进程:com.example.poly,PID:20694 java.lang.NullPointerException:尝试调用虚拟方法 'void com.google.android.gms.maps.model.Polyline.setColor(int)' 空对象引用 在 com.example.poly.MainActivity.onProgressChanged(MainActivity.java:149) 在 android.widget.SeekBar.onProgressRefresh(SeekBar.java:93) 在 android.widget.ProgressBar.doRefreshProgress(ProgressBar.java:1327) 在 android.widget.ProgressBar.refreshProgress(ProgressBar.java:1382) 在 android.widget.ProgressBar.setProgressInternal(ProgressBar.java:1447) 在 android.widget.AbsSeekBar.trackTouchEvent(AbsSeekBar.java:850) 在 android.widget.AbsSeekBar.onTouchEvent(AbsSeekBar.java:760) 在 android.view.View.dispatchTouchEvent(View.java:9943) 在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358) 在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358) 在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358) 在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358) 在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358) 在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358) 在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669) 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358) 在 com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:411) 在 com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1810) 在 android.app.Activity.dispatchTouchEvent(Activity.java:3061) 在 androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69) 在 com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:373) 在 android.view.View.dispatchPointerEvent(View.java:10163) 在 android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4434) 在 android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4302) 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849) 在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902) 在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868) 在 android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3995) 在 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876) 在 android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4052) 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849) 在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902) 在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868) 在 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876) 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849) 在 android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6210) 在 android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6184) 在 android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6145) 在 android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6313) 在 android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) 在 android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(本机 方法) 在 android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176) 在 android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:6284) 在 android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:6336)
【问题讨论】:
-
您的问题标题非常糟糕,您遇到的问题与谷歌地图折线有关,我只能猜测您的地图尚未初始化,您正在尝试使用它,请更正您的标题。
-
感谢您的建议。我对标题进行了更改。你能告诉我如何去纠正它吗?我是 Android Studio 的初学者。
-
@Daiel Ravichandran 我刚刚发布了一个答案,检查一下,它应该可以解决崩溃问题,如果可以,请标记为答案。
-
您的折线始终为空...您在关注哪些示例?他们在哪里定义它?
-
@Whales 感谢您的帮助。我按照您的建议进行了更改。该应用程序现在可以在模拟器上运行,但是当我在手机上安装它时会崩溃。 logcat 上的同样错误仍然出现。
标签: java android nullpointerexception