Tôi đã googling ass của tôi cố gắng tìm một ai đó có cùng một vấn đề như tôi, mà không có may mắn. Vì vậy, đây là vấn đề của tôi:Geocoder tự động hoàn thành trong android
Tôi đang cố triển khai đề xuất địa chỉ tự động hoàn tất khi người dùng nhập tên địa điểm bằng cách sử dụng trình mã hóa địa lý trong Android. Tôi muốn điều này hoạt động giống như phiên bản javascript bằng cách sử dụng một hộp đựng.
Tôi đang sử dụng bố cục với AutoCompleteTextView và một mảng để tự động cập nhật danh sách đề xuất khi người dùng nhập. Tôi đã thêm một sự chậm trễ 500ms từ khi sự kiện onTextChanged() nhận được trước khi một cuộc gọi đến geocoder.getFromLocationName được gọi bằng cách sử dụng một Handler. Nếu người dùng nhập thêm thư trong vòng 500 mili giây, sự kiện cuối cùng sẽ bị hủy. Vấn đề tôi gặp phải là các đề xuất hầu như không bao giờ hiển thị trong giao diện người dùng dưới dạng các lựa chọn trong menu thả xuống. Tôi nhận được gợi ý địa chỉ, nhưng khi tôi thêm chúng vào bộ điều hợp gắn liền với autocomplatetextview chúng đơn giản sẽ không hiển thị.
Tôi đang chạy tính năng này trên trình mô phỏng sử dụng API cấp 7, kèm theo bao gồm google apis.
Bây giờ một số mã nguồn để hỗ trợ bạn: Cách bố trí:
<LinearLayout android:id="@+id/searchInputLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="6dip"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/searchMessage" />
<EditText android:id="@+id/freetextInput"
android:hint="@string/searchFreetextLabel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/editbox_background" />
<CheckBox android:id="@+id/includeVincinityCheckbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/includeVincinityLabel"
android:checked="true"
android:onClick="includeVincinityClick" />
<AutoCompleteTextView android:id="@+id/locationInput"
android:hint="@string/locationInputHint"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<Button android:id="@+id/searchButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/searchBtnLabel"
android:onClick="searchBtnClicked" />
</LinearLayout>
Mã nguồn của hoạt động của tôi (mã tôi đã bỏ qua không liên quan):
public class SearchLocationTabActivity extends Activity implements TextWatcher, OnItemSelectedListener {
private static final int MESSAGE_TEXT_CHANGED = 0;
private static final int AUTOCOMPLETE_DELAY = 500;
private static final int THRESHOLD = 3;
private String latitude, longitude;
private List<Address> autoCompleteSuggestionAddresses;
private ArrayAdapter<String> autoCompleteAdapter;
private Handler messageHandler;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.search);
setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
messageHandler = new MyMessageHandler(this, this);
autoCompleteAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, new ArrayList<String>());
autoCompleteAdapter.setNotifyOnChange(false);
AutoCompleteTextView locationinput = (AutoCompleteTextView) findViewById(R.id.locationInput);
locationinput.addTextChangedListener(this);
locationinput.setOnItemSelectedListener(this);
locationinput.setThreshold(THRESHOLD);
locationinput.setAdapter(autoCompleteAdapter);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
messageHandler.removeMessages(MESSAGE_TEXT_CHANGED);
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
String value = arg0.toString();
if (!"".equals(value) && value.length() >= THRESHOLD) {
Message msg = Message.obtain(messageHandler, MESSAGE_TEXT_CHANGED, arg0.toString());
messageHandler.sendMessageDelayed(msg, AUTOCOMPLETE_DELAY);
} else {
autoCompleteAdapter.clear();
}
}
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
if (arg2 < autoCompleteSuggestionAddresses.size()) {
Address selected = autoCompleteSuggestionAddresses.get(arg2);
latitude = Double.toString(selected.getLatitude());
longitude = Double.toString(selected.getLongitude());
}
}
private void notifyResult(List<Address> suggestions) {
latitude = longitude = null;
autoCompleteAdapter.clear();
for (Address a : autoCompleteSuggestionAddresses) {
autoCompleteAdapter.add(a.toString());//TODO: figure out a nice way to display this address in list
}
autoCompleteAdapter.notifyDataSetChanged();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
latitude = longitude = null;
}
private class MyMessageHandler extends Handler {
private Context context;
private AsyncTaskSubscriber subscriber;
public MyMessageHandler(Context context, AsyncTaskSubscriber subscriber) {
this.context = context;
this.subscriber = subscriber;
}
@Override
public void handleMessage(Message msg) {
if (msg.what == MESSAGE_TEXT_CHANGED) {
String enteredText = (String) msg.obj;
try {
autoCompleteSuggestionAddresses = new Geocoder(context).getFromLocationName(enteredText, 10);
notifyResult(response);
} catch (IOException ex) {
Log.e(GeoCoderAsyncTask.class.getName(), "Failed to get autocomplete suggestions", ex);
}
}
}
}
}
Bất kỳ sự giúp đỡ nhiều đánh giá cao!
Tôi đang gặp sự cố tương tự. Điều gì thực sự là giải pháp của bạn? – jayearn
tôi đã xóa bộ lọc trên chế độ xem tự động hoàn thành. xem giải pháp giải thích dưới đây;) –