简体   繁体   English

当我在autocompletetextview中给空格键时,我的应用程序崩溃了

[英]My app is crashing when i give Space bar in autocompletetextview

My app is crashing when i give space bar in autocompletetextview. 当我在autocompletetextview中提供空格键时,我的应用程序崩溃了。

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback,
    GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener,
    LocationListener, AdapterView.OnItemClickListener {

private GoogleMap mMap;
    GoogleApiClient mGoogleApiClient;
    Location mLastLocation;
    Marker mCurrLocationMarker,FindMarker;
    LocationRequest mLocationRequest;
    AutoCompleteTextView atvPlaces;
    DownloadTask placesDownloadTask;
    DownloadTask placeDetailsDownloadTask;
    ParserTask placesParserTask;
    ParserTask placeDetailsParserTask;
    LatLng latLng;
    final int PLACES = 0;
    final int PLACES_DETAILS = 1;
    ListView lv;
    ImageButton remove;
    private boolean exit = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    // setSupportActionBar(toolbar);

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    checkLocationPermission();
    }

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {
    onLocationChanged(mLastLocation);
    }
    });

    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
    .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);


    remove = (ImageButton)findViewById(R.id.place_autocomplete_clear_button);

    // Getting a reference to the AutoCompleteTextView
    atvPlaces = (AutoCompleteTextView) findViewById(R.id.id_search_EditText);
    atvPlaces.setThreshold(1);

    // Adding textchange listener
    atvPlaces.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    // Creating a DownloadTask to download Google Places matching "s"
    placesDownloadTask = new DownloadTask(PLACES);

    // Getting url to the Google Places Autocomplete api
    String url = getAutoCompleteUrl(s.toString());

    // Start downloading Google Places
    // This causes to execute doInBackground() of DownloadTask class
    placesDownloadTask.execute(url);

        if (!atvPlaces.getText().toString().equals("")){
            lv.setVisibility(View.VISIBLE);
            remove.setVisibility(View.VISIBLE);
        }else  {
            lv.setVisibility(View.GONE);
            remove.setVisibility(View.GONE);
        }


    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
    int after) {
    // TODO Auto-generated method stub
    }

    @Override
    public void afterTextChanged(Editable s) {
    // TODO Auto-generated method stub
    }
    });

    // Setting an item click listener for the AutoCompleteTextView dropdown list
   /* atvPlaces.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int index,
    long id) {

    ListView lv = (ListView) arg0;
    SimpleAdapter adapter = (SimpleAdapter) arg0.getAdapter();

    HashMap<String, String> hm = (HashMap<String, String>) adapter.getItem(index);

    // Creating a DownloadTask to download Places details of the selected place
    placeDetailsDownloadTask = new DownloadTask(PLACES_DETAILS);

    // Getting url to the Google Places details api
    String url = getPlaceDetailsUrl(hm.get("reference"));

    // Start downloading Google Place Details
    // This causes to execute doInBackground() of DownloadTask class
    placeDetailsDownloadTask.execute(url);

        InputMethodManager inputManager = (InputMethodManager)
                getSystemService(Context.INPUT_METHOD_SERVICE);

        inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                InputMethodManager.HIDE_NOT_ALWAYS);


    }
    });*/
    lv=(ListView)findViewById(R.id.list);

    lv.setOnItemClickListener(this);


   setListenerOnWidget();
}

private void setListenerOnWidget() {
    View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
        atvPlaces.setText("");
        }
    };
    remove.setOnClickListener(listener);
}

@Override
public void onBackPressed() {
    if(exit){
        finish();
    }else {
        Toast.makeText(this, "Tap Back again to Exit.",
                Toast.LENGTH_SHORT).show();
        exit = true;
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                exit = false;
            }
        }, 3 * 1000);

    }
    }


    @Override
    public void onItemClick (AdapterView < ? > adapterView, View view,int i, long l){
    ListView lv = (ListView) adapterView;
    SimpleAdapter adapter = (SimpleAdapter) adapterView.getAdapter();

    HashMap<String, String> hm = (HashMap<String, String>) adapter.getItem(i);

    // Creating a DownloadTask to download Places details of the selected place
    placeDetailsDownloadTask = new DownloadTask(PLACES_DETAILS);

    // Getting url to the Google Places details api
    String url = getPlaceDetailsUrl(hm.get("reference"));

    // Start downloading Google Place Details
    // This causes to execute doInBackground() of DownloadTask class
    placeDetailsDownloadTask.execute(url);

    InputMethodManager inputManager = (InputMethodManager)
            getSystemService(Context.INPUT_METHOD_SERVICE);

    inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
            InputMethodManager.HIDE_NOT_ALWAYS);

    String str = ((TextView) view.findViewById(R.id.place_name)).getText().toString();
    Toast.makeText(this,str, Toast.LENGTH_SHORT).show();
    atvPlaces.setText(str.replace(' ',','));

    lv.setVisibility(view.GONE);


}



private String getPlaceDetailsUrl(String ref) {
    // Obtain browser key from https://code.google.com/apis/console
    String key = "key=AIzaSyCQNRAkYhQ4CDwDV-0Oh-kNFdrUY1NwSI0";

    // reference of place
    String reference = "reference=" + ref;

    // Sensor enabled
    String sensor = "sensor=false";

    // Building the parameters to the web service
    String parameters = reference + "&" + sensor + "&" + key;

    // Output format
    String output = "json";

    // Building the url to the web service
    String url = "https://maps.googleapis.com/maps/api/place/details/" + output + "?" + parameters;

    return url;
    }

 private String getAutoCompleteUrl(String place) {
    // Obtain browser key from https://code.google.com/apis/console
    String key = "key=AIzaSyCQNRAkYhQ4CDwDV-0Oh-kNFdrUY1NwSI0";

    // place to be be searched
    String input = "input=" + place;

    // place type to be searched
    String types = "types=geocode";

    // Sensor enabled
    String sensor = "sensor=false";

    // Building the parameters to the web service
    String parameters = input + "&" + types + "&" + sensor + "&" + key;

    // Output format
    String output = "json";

    // Building the url to the web service
    String url = "https://maps.googleapis.com/maps/api/place/autocomplete/" + output + "?" + parameters;

    return url;
    }


 private String downloadUrl(String strUrl) throws IOException {
    String data = "";
    InputStream iStream = null;
    HttpURLConnection urlConnection = null;
    try {
    URL url = new URL(strUrl);

    // Creating an http connection to communicate with url
    urlConnection = (HttpURLConnection) url.openConnection();

    // Connecting to url
    urlConnection.connect();

    // Reading data from url
    iStream = urlConnection.getInputStream();

    BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

    StringBuffer sb = new StringBuffer();

    String line = "";
    while ((line = br.readLine()) != null) {
    sb.append(line);
    }

    data = sb.toString();

    br.close();

    } catch (Exception e) {
    Log.d("Exception while downloading url", e.toString());
    } finally {
    iStream.close();
    urlConnection.disconnect();
    }
    return data;
    }

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;

public boolean checkLocationPermission() {
    if (ContextCompat.checkSelfPermission(this,
    Manifest.permission.ACCESS_FINE_LOCATION)
    != PackageManager.PERMISSION_GRANTED) {

    if (ActivityCompat.shouldShowRequestPermissionRationale(this,
    Manifest.permission.ACCESS_FINE_LOCATION)) {

    ActivityCompat.requestPermissions(this,
    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
    MY_PERMISSIONS_REQUEST_LOCATION);
    } else {
    ActivityCompat.requestPermissions(this,
    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
    MY_PERMISSIONS_REQUEST_LOCATION);
    }
    return false;
    } else {
    return true;
    }

    }

@Override
 public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
    }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
    return true;
    }

    return super.onOptionsItemSelected(item);
    }

 @Override
 public void onConnected(@Nullable Bundle bundle) {
    mLocationRequest = new LocationRequest();
    //mLocationRequest.setInterval(1000);
    //mLocationRequest.setFastestInterval(1000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

    if (ContextCompat.checkSelfPermission(this,
    Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
    }
    }

 @Override
public void onConnectionSuspended(int i) {

    }

 @Override
 public void onLocationChanged(Location location) {
mLastLocation = location;
if(mCurrLocationMarker != null){
    mCurrLocationMarker.remove();
}

LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
MarkerOptions markerOption = new MarkerOptions();
markerOption.position(latLng);
markerOption.title("Current Position");
 markerOption.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));
mCurrLocationMarker = mMap.addMarker(markerOption);
Toast.makeText(this,"Location changed",Toast.LENGTH_SHORT).show();
CameraPosition cameraPosition = new CameraPosition.Builder().target(latLng).zoom(13).build();
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

if(mGoogleApiClient != null){
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,this);
}

    loadNearByPlaces(location.getLatitude(), location.getLongitude());
    }

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

 @Override
 public void onMapReady(GoogleMap googleMap) {

    mMap = googleMap;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (ContextCompat.checkSelfPermission(this,
    android.Manifest.permission.ACCESS_FINE_LOCATION)
    == PackageManager.PERMISSION_GRANTED) {
    buildGoogleApiClient();
    mMap.setMyLocationEnabled(true);

    }
    } else {
    buildGoogleApiClient();
    mMap.setMyLocationEnabled(true);
    }

    }

 protected synchronized void buildGoogleApiClient() {
     mGoogleApiClient = new GoogleApiClient.Builder(this)
    .addConnectionCallbacks(this)
    .addOnConnectionFailedListener(this)
    .addApi(LocationServices.API)
    .build();
    mGoogleApiClient.connect();
    }

 @Override
 public void onRequestPermissionsResult(int requestCode,
    String permissions[], int[] grantResult) {
    switch (requestCode) {
    case MY_PERMISSIONS_REQUEST_LOCATION: {

    if (grantResult.length > 0
    && grantResult[0] == PackageManager.PERMISSION_GRANTED) {
    if (ContextCompat.checkSelfPermission(this,
    Manifest.permission.ACCESS_FINE_LOCATION)
    == PackageManager.PERMISSION_GRANTED) {
    if (mGoogleApiClient == null) {
    buildGoogleApiClient();
    }
    mMap.setMyLocationEnabled(true);
    }

    } else {
    Toast.makeText(this, "permisison denied", Toast.LENGTH_LONG).show();
    }
    return;
    }

    }
    }

 private void loadNearByPlaces(double latitude, double longitude) {
//YOU Can change this type at your own will, e.g hospital, cafe,   restaurant.... and see how it all works
    String type = "liquor";
    StringBuilder googlePlacesUrl =
    new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?");
    googlePlacesUrl.append("location=").append(latitude).append(",").append(longitude);
    googlePlacesUrl.append("&radius=").append(PROXIMITY_RADIUS);
    googlePlacesUrl.append("&types=").append(type);
    googlePlacesUrl.append("&sensor=true");
    googlePlacesUrl.append("&key=" + GOOGLE_BROWSER_API_KEY);

    JsonObjectRequest request = new JsonObjectRequest(googlePlacesUrl.toString(),
    new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject result) {

    Log.i(TAG, "onResponse: Result= " + result.toString());
    parseLocationResult(result);
    }
    },
    new Response.ErrorListener() {
 @Override
 public void onErrorResponse(VolleyError error) {
    Log.e(TAG, "onErrorResponse: Error= " + error);
    Log.e(TAG, "onErrorResponse: Error= " + error.getMessage());
    }
    });

    AppController.getInstance().addToRequestQueue(request);
    }

 private void parseLocationResult(JSONObject result) {

    String id, place_id, placeName = null, reference, icon, vicinity = null;
    double latitude, longitude;

    try {
    JSONArray jsonArray = result.getJSONArray("results");

    if (result.getString(STATUS).equalsIgnoreCase(OK)) {

    //mMap.clear();

    for (int i = 0; i < jsonArray.length(); i++) {
    JSONObject place = jsonArray.getJSONObject(i);

    id = place.getString(ATM_ID);
    place_id = place.getString(PLACE_ID);
    if (!place.isNull(NAME)) {
    placeName = place.getString(NAME);
    }
    if (!place.isNull(VICINITY)) {
    vicinity = place.getString(VICINITY);
    }
    latitude = place.getJSONObject(GEOMETRY).getJSONObject(LOCATION)
    .getDouble(LATITUDE);
    longitude = place.getJSONObject(GEOMETRY).getJSONObject(LOCATION)
    .getDouble(LONGITUDE);
    reference = place.getString(REFERENCE);
    icon = place.getString(ICON);

    MarkerOptions markerOptions = new MarkerOptions();
    LatLng latLng = new LatLng(latitude, longitude);
    markerOptions.position(latLng);
    markerOptions.title(placeName);
        markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));
        markerOptions.snippet(vicinity);
    mMap.addMarker(markerOptions);

        mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {

            @Override
            public View getInfoWindow(Marker arg0) {

                return null;
            }

            @Override
            public View getInfoContents(Marker marker) {
                View myContentsView = getLayoutInflater().inflate(R.layout.marker, null);
                TextView tvTitle = ((TextView)myContentsView.findViewById(R.id.title));
                tvTitle.setText(marker.getTitle());
                TextView tvSnippet = ((TextView)myContentsView.findViewById(R.id.snippet));
                tvSnippet.setText(marker.getSnippet());
                return myContentsView;
            }
        });

    }

    Toast.makeText(getBaseContext(), jsonArray.length() + " ATM_FOUND!",
    Toast.LENGTH_SHORT).show();
    } else if (result.getString(STATUS).equalsIgnoreCase(ZERO_RESULTS)) {
    Toast.makeText(getBaseContext(), "No ATM found in 5KM radius!!!",
    Toast.LENGTH_LONG).show();
    }

    } catch (JSONException e) {

    e.printStackTrace();
    Log.e(TAG, "parseLocationResult: Error=" + e.getMessage());
    }
    }

 private class DownloadTask extends AsyncTask<String, Void, String> {
private int downloadType = 0;

// Constructor
public DownloadTask(int type) {
    this.downloadType = type;
}

@Override
protected String doInBackground(String... url) {
    // For storing data from web service
    String data = "";

    try {
        // Fetching the data from web service
        data = downloadUrl(url[0]);
    } catch (Exception e) {
        Log.d("Background Task", e.toString());
    }
    return data;
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);

    switch (downloadType) {
        case PLACES:
            // Creating ParserTask for parsing Google Places
            placesParserTask = new ParserTask(PLACES);

            // Start parsing google places json data
            // This causes to execute doInBackground() of ParserTask class
            placesParserTask.execute(result);

            break;

        case PLACES_DETAILS:
            // Creating ParserTask for parsing Google Places
            placeDetailsParserTask = new ParserTask(PLACES_DETAILS);

            // Starting Parsing the JSON string
            // This causes to execute doInBackground() of ParserTask class
            placeDetailsParserTask.execute(result);
    }
    }
  }


private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String, String>>> {

int parserType = 0;

public ParserTask(int type) {
    this.parserType = type;
}

@Override
protected List<HashMap<String, String>> doInBackground(String... jsonData) {

    JSONObject jObject;
    List<HashMap<String, String>> list = null;

    try {
        jObject = new JSONObject(jsonData[0]);

        switch (parserType) {
            case PLACES:
                PlaceJSONParser placeJsonParser = new PlaceJSONParser();
                // Getting the parsed data as a List construct
                list = placeJsonParser.parse(jObject);
                break;
            case PLACES_DETAILS:
                PlaceDetailsJSONParser placeDetailsJsonParser = new   PlaceDetailsJSONParser();
                // Getting the parsed data as a List construct
                list = placeDetailsJsonParser.parse(jObject);
        }

    } catch (Exception e) {
        Log.d("Exception", e.toString());
    }
    return list;
}

@Override
protected void onPostExecute(List<HashMap<String, String>> result) {

    switch (parserType) {
        case PLACES:
            String[] from = new String[]{"description"};
            int[] to = new int[]{R.id.place_name};

            // Creating a SimpleAdapter for the AutoCompleteTextView
            //SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), result, android.R.layout.simple_list_item_1, from, to);

            // Setting the adapter
            //atvPlaces.setAdapter(adapter);

            ListAdapter adapter = new SimpleAdapter(MainActivity.this, result,R.layout.row,from,to);
            // Adding data into listview
            lv.setAdapter(adapter);
            break;
        case PLACES_DETAILS:
            String location = atvPlaces.getText().toString();
            if (location != null && !location.equals("")) {
                new GeocoderTask().execute(location);


            }

            break;
    }
    }
}

 private class GeocoderTask extends AsyncTask<String, Void, List<Address>> {

@Override
protected List<Address> doInBackground(String... locationName) {
    // TODO Auto-generated method stub

    Geocoder geocoder = new Geocoder(getBaseContext());
    List<Address> addresses = null;

    try {
        // Getting a maximum of 3 Address that matches the input text
        addresses = geocoder.getFromLocationName(locationName[0], 3);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return addresses;
}

protected void onPostExecute(List<Address> addresses) {
    if(addresses==null || addresses.size()==0){
        Toast.makeText(getBaseContext(), "No Location found", Toast.LENGTH_SHORT).show();
    }
    for(int i=0;i<addresses.size();i++){
        Address address =  (Address)addresses.get(i);
        latLng = new LatLng(address.getLatitude(), address.getLongitude());
        String addressText = String.format("%s, %s",
                address.getMaxAddressLineIndex() > 0 ? address.getAddressLine(0) : "",
                address.getCountryName());
        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.position(latLng);
        markerOptions.title("Find Location");
        markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
        FindMarker = mMap.addMarker(markerOptions);

        CameraPosition cameraPosition = new CameraPosition.Builder().target(latLng).zoom(13).build();
        mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

        loadNearByPlaces(address.getLatitude(), address.getLongitude());


    }

}

}

} 

Add trim() while getAutoCompleteUrl() getAutoCompleteUrl()时添加trim() getAutoCompleteUrl()

    @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        // Creating a DownloadTask to download Google Places matching "s"
        placesDownloadTask = new DownloadTask(PLACES);

        // Getting url to the Google Places Autocomplete api
        String url = getAutoCompleteUrl(s.toString().trim());
        ....
    }

add this line: 添加此行:

protected void onPostExecute(List<Address> addresses) {
if(addresses==null || addresses.size()==0){
    Toast.makeText(getBaseContext(), "No Location found", Toast.LENGTH_SHORT).show();
    return;
}
for(int i=0;i<addresses.size();i++){
....

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM