Java 当我在SearchView中搜索任何位置时,我的应用程序停止
我试图运行与以下youtube视频中显示的代码相同的代码。。。 但当我尝试运行它时,地图会加载,但当我搜索任何查询(位置)时,它会停止。。。 代码如下: MainActivity.javaJava 当我在SearchView中搜索任何位置时,我的应用程序停止,java,android,android-studio,Java,Android,Android Studio,我试图运行与以下youtube视频中显示的代码相同的代码。。。 但当我尝试运行它时,地图会加载,但当我搜索任何查询(位置)时,它会停止。。。 代码如下: MainActivity.java package com.example.maps; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentActivity; import android.location.Addre
package com.example.maps;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentActivity;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.widget.SearchView;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import java.io.IOException;
import java.util.List;
public class MainActivity extends FragmentActivity implements OnMapReadyCallback {
GoogleMap gmap;
SupportMapFragment supportMapFragment;
SearchView searchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
searchView=findViewById(R.id.sv_location);
supportMapFragment=(SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.pickup);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
String location = searchView.getQuery().toString();
List<Address> addressList=null;
if(location != null || !location.equals("")){
Geocoder geocoder=new Geocoder(MainActivity.this);
try {
addressList=geocoder.getFromLocationName(location,1);
Address address = addressList.get(0);
LatLng latLng=new LatLng(address.getLatitude(),address.getLongitude());
gmap.addMarker(new MarkerOptions().position(latLng).title(location));
gmap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,10));
}catch (IOException e){
e.printStackTrace();
}
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
supportMapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
}
}
您尚未初始化
gmap
。您可以按如下所示进行操作:
您尚未初始化
gmap
。您可以按如下所示进行操作:
您正在使用访问gmap对象而不进行初始化。因此,请在中初始化它
package com.example.maps;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentActivity;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.widget.SearchView;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import java.io.IOException;
import java.util.List;
public class MainActivity extends FragmentActivity implements OnMapReadyCallback {
GoogleMap gmap;
SupportMapFragment supportMapFragment;
SearchView searchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
searchView=findViewById(R.id.sv_location);
supportMapFragment=(SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.pickup);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
String location = searchView.getQuery().toString();
List<Address> addressList=null;
if(location != null || !location.equals("")){
Geocoder geocoder=new Geocoder(MainActivity.this);
try {
addressList=geocoder.getFromLocationName(location,1);
Address address = addressList.get(0);
LatLng latLng=new LatLng(address.getLatitude(),address.getLongitude());
gmap.addMarker(new MarkerOptions().position(latLng).title(location));
gmap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,10));
}catch (IOException e){
e.printStackTrace();
}
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
supportMapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
gmap = googleMap;
}
您正在使用访问gmap对象而不进行初始化。因此,请在中初始化它
package com.example.maps;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentActivity;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.widget.SearchView;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import java.io.IOException;
import java.util.List;
public class MainActivity extends FragmentActivity implements OnMapReadyCallback {
GoogleMap gmap;
SupportMapFragment supportMapFragment;
SearchView searchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
searchView=findViewById(R.id.sv_location);
supportMapFragment=(SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.pickup);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
String location = searchView.getQuery().toString();
List<Address> addressList=null;
if(location != null || !location.equals("")){
Geocoder geocoder=new Geocoder(MainActivity.this);
try {
addressList=geocoder.getFromLocationName(location,1);
Address address = addressList.get(0);
LatLng latLng=new LatLng(address.getLatitude(),address.getLongitude());
gmap.addMarker(new MarkerOptions().position(latLng).title(location));
gmap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,10));
}catch (IOException e){
e.printStackTrace();
}
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
supportMapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
gmap = googleMap;
}
但现在,当我再次搜索位置,然后标记被一次又一次地创建..但我想从上次搜索的位置删除标记,并将其放置到新位置..那么你能建议我吗…?@smith,你有你的答案@Wahdatchmii,你的答案可以用来澄清问题,但使用起来并不总是好的做法that@Tuqay你能建议我在我的代码中还可以使用什么好的实践吗?@smith这真的取决于你的用例。如果您不再需要并且不想删除多个标记,那么最好使用
clear()
。但是如果你想保存其中的一些,那么remove()
将是一个更好的选择但是现在当我再次搜索位置时,标记会被一次又一次地创建..但是我想从上次搜索的位置删除标记并将其放置到新位置..那么你能建议我吗?@smith,你有你的答案@wahdatskimi,你的答案可以用来澄清问题,但使用起来并不总是好的做法that@Tuqay你能建议我在我的代码中还可以使用什么好的实践吗?@smith这真的取决于你的用例。如果您不再需要并且不想删除多个标记,那么最好使用clear()
。但是如果您想保存其中一些,那么remove()
将是一个更好的选择感谢它的有效性,,,但是现在当我再次搜索位置时,标记会被一次又一次地创建。但是我想从上次搜索的位置删除标记,并将其放置到新位置。那么你能建议我吗…?我已经在下面答案的注释中提供了链接,所以我应该使用gmap.clear()函数删除标记吗?谢谢它有效,,,但是现在当我再次搜索位置,然后标记被一次又一次地创建..但是我想从上次搜索的位置删除标记,并将其放置到新位置..那么你能建议我吗..我在下面答案的注释中提供了链接,那么我应该使用gmap.clear()函数删除标记吗?
public void onMapReady(GoogleMap googleMap) {
gmap = googleMap;
}
package com.example.maps;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentActivity;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.widget.SearchView;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import java.io.IOException;
import java.util.List;
public class MainActivity extends FragmentActivity implements OnMapReadyCallback {
GoogleMap gmap;
SupportMapFragment supportMapFragment;
SearchView searchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
searchView=findViewById(R.id.sv_location);
supportMapFragment=(SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.pickup);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
String location = searchView.getQuery().toString();
List<Address> addressList=null;
if(location != null || !location.equals("")){
Geocoder geocoder=new Geocoder(MainActivity.this);
try {
addressList=geocoder.getFromLocationName(location,1);
Address address = addressList.get(0);
LatLng latLng=new LatLng(address.getLatitude(),address.getLongitude());
gmap.addMarker(new MarkerOptions().position(latLng).title(location));
gmap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,10));
}catch (IOException e){
e.printStackTrace();
}
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
supportMapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
gmap = googleMap;
}
gmap.clear();