2013-12-14 11 views
7

Ich folgte this tutorial für die Autovervollständigung Textansicht mit Google Orte API. Ich möchte eine Autocomplete-Textansicht, die sich bei der Eingabe automatisch mit den Ortsnamen füllt. Das oben genannte Tutorial ist genau das, was ich benötige, aber es funktioniert nicht für mich. Die Autofill-Aktion findet nicht statt. Kann jemand einen Ausweg vorschlagen? HierAutocomplete Textansicht Google Places api

ist die Haupttätigkeit

public class MainActivity extends Activity { 

AutoCompleteTextView atvPlaces; 
PlacesTask placesTask; 
ParserTask parserTask; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    atvPlaces = (AutoCompleteTextView) findViewById(R.id.atv_places); 
    atvPlaces.setThreshold(1); 

    atvPlaces.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      placesTask = new PlacesTask(); 
      placesTask.execute(s.toString()); 
     } 

     @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 
     } 
    }); 
} 

/** A method to download json data from 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)); 

     StringBuilder sb = new StringBuilder(); 

     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; 
} 

// Fetches all places from GooglePlaces AutoComplete Web Service 
private class PlacesTask extends AsyncTask<String, Void, String>{ 

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

     // Obtain browser key from https://code.google.com/apis/console 
     String key = "key=AIzaSyBB5KBkuA4-qm8QxaXX8FhHqhHsESMdAzI"; 

     String input=""; 

     try { 
      input = "input=" + URLEncoder.encode(place[0], "utf-8"); 
     } catch (UnsupportedEncodingException e1) { 
      e1.printStackTrace(); 
     } 

     // 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; 

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

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

     // Creating ParserTask 
     parserTask = new ParserTask(); 

     // Starting Parsing the JSON string returned by Web Service 
     parserTask.execute(result); 
    } 
} 
/** A class to parse the Google Places in JSON format */ 
private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String,String>>>{ 

    JSONObject jObject; 

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

     List<HashMap<String, String>> places = null; 

     PlaceJSONParser placeJsonParser = new PlaceJSONParser(); 

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

      // Getting the parsed data as a List construct 
      places = placeJsonParser.parse(jObject); 

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

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

     String[] from = new String[] { "description"}; 
     int[] to = new int[] { android.R.id.text1 }; 

     // 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); 
    } 
} 

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

Dies ist der PlaceJSONParser.java

public class PlaceJSONParser { 

/** Receives a JSONObject and returns a list */ 
public List<HashMap<String,String>> parse(JSONObject jObject){ 

    JSONArray jPlaces = null; 
    try { 
     /** Retrieves all the elements in the 'places' array */ 
     jPlaces = jObject.getJSONArray("predictions"); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    /** Invoking getPlaces with the array of json object 
    * where each json object represent a place 
    */ 
    return getPlaces(jPlaces); 
} 

private List<HashMap<String, String>> getPlaces(JSONArray jPlaces){ 
    int placesCount = jPlaces.length(); 
    List<HashMap<String, String>> placesList = new ArrayList<HashMap<String,String>>(); 
    HashMap<String, String> place = null; 

    /** Taking each place, parses and adds to list object */ 
    for(int i=0; i<placesCount;i++){ 
     try { 
      /** Call getPlace with place JSON object to parse the place */ 
      place = getPlace((JSONObject)jPlaces.get(i)); 
      placesList.add(place); 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    return placesList; 
} 

/** Parsing the Place JSON object */ 
private HashMap<String, String> getPlace(JSONObject jPlace){ 

    HashMap<String, String> place = new HashMap<String, String>(); 

    String id=""; 
    String reference=""; 
    String description=""; 

    try { 

     description = jPlace.getString("description"); 
     id = jPlace.getString("id"); 
     reference = jPlace.getString("reference"); 

     place.put("description", description); 
     place.put("_id",id); 
     place.put("reference",reference); 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    return place; 
} 
} 

Dies ist der CustomAutoCompleteTextView.java

public class CustomAutoCompleteTextView extends AutoCompleteTextView { 

public CustomAutoCompleteTextView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

/** Returns the place description corresponding to the selected item */ 
@Override 
protected CharSequence convertSelectionToString(Object selectedItem) { 
    /** Each item in the autocompetetextview suggestion list is a hashmap object */ 
    HashMap<String, String> hm = (HashMap<String, String>) selectedItem; 
    return hm.get("description"); 
} 
} 

Dies ist die Manifest-Datei

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.map5" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="18" /> 

<uses-permission android:name="android.permission.INTERNET"/> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.map5.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

+0

Wenn Sie Folge dem Tutorial dann sollte es Arbeit. Wenn nicht, ist es schwierig zu erraten, was Sie tun, ohne den Code zu betrachten. Veröffentlichen Sie den erforderlichen Code. – JoelFernandes

+0

@JoelFernandes Ich weiß nicht, was falsch ist. Aber ich bekomme den Autofill-Effekt nicht. –

Antwort

7

setThreshold oder showDropDown auf Ihre autocompletetextview den Vorschlag zu zeigen

atvPlaces.setOnTouchListener(new View.OnTouchListener(){ 
    @Override 
    public boolean onTouch(View v, MotionEvent event){ 
     atvPlaces.showDropDown(); 
     return false; 
    } 
}); 

siehe Link here

+0

änderte den Schlüssel und fügte diesen code.and jetzt seine working.thanks viel hinzu :) –

+0

kann jemand die erforderlichen Änderungen für zwei Autocomplete textviews.Say vorschlagen, 1 für Quellplatz und 2. für Bestimmungsort. –

+2

bro .... ich neu in android. Ich benutze auch das gleiche Tutorial, das Sie verwendet haben, aber meine automatische Füllaktion findet nicht statt. Ich habe Google Browser API-Schlüssel mit diesem Link https://maps.googleapis.com/maps/api/place/autocomplete/"+output+"?"+parameters.any Hilfe wird geschätzt und danke im Voraus –

1

ermöglichen Google Places API Web Service in der Developers Console

Verwandte Themen