Java 当我在SearchView中搜索任何位置时,我的应用程序停止

Java 当我在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

我试图运行与以下youtube视频中显示的代码相同的代码。。。

但当我尝试运行它时,地图会加载,但当我搜索任何查询(位置)时,它会停止。。。 代码如下:

MainActivity.java

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();