Android Place自动填充片段(无法设置文字)

弱龄寄事外,委怀在琴书。这篇文章主要讲述Android Place自动填充片段:无法设置文字相关的知识,希望能为你提供帮助。
Google最近更新了他们的Places SDK for android,所以现在我也在更新我的代码。我正在尝试使用AutocompleteSupportFragment来允许用户设置他们的地址。
这是我的代码:

mAddressEditText = (AutocompleteSupportFragment) getSupportFragmentManager().findFragmentById(R.id.address); mAddressEditText.setPlaceFields(Arrays.asList(Place.Field.ADDRESS, Place.Field.LAT_LNG)); mAddressEditText.setHint("Address"); mAddressEditText.setText("Test1"); // Works fine at the beginning, disappears after selecting a place and shows only the hint mAddressEditText.setOnPlaceSelectedListener(new PlaceSelectionListener() { @Override public void onPlaceSelected(Place place) { Log.d(TAG, "Place Selected"); // Other Stuff mAddressEditText.setText("Test2"); // Doesn't Work, all I can see is the hint mAddressEditText.setText(place.getAddress()); // Doesn't Work, all I can see is the hint }@Override public void onError(Status status) { Log.e(TAG, "An error occurred: " + status); invalidAddressDialog.show(); } });

在之前的SDK中,片段会自动将文本设置为所选地址。这在新SDK中不起作用(不确定是否有意)。所以我试图手动设置它。正如您在我的代码中的注释中所看到的,使用setText在侦听器之外工作正常。在听众里面他们没有。
我做错了什么或这是一个错误?
编辑:这么久,我仍然无法得到适当的解决方案。要非常清楚,我可以从片段中正确地获取地址,唯一不起作用的是setText
但是,由于一些答案表明他们没有遇到同样的问题,我开始认为它可能与我正在使用的库版本有关?
这些是我在build.gradle中的库:
api 'com.android.support:appcompat-v7:28.0.0' api 'com.android.support:support-annotations:28.0.0'api 'com.android.support:multidex:1.0.3'api 'com.google.firebase:firebase-core:16.0.8' api 'com.google.firebase:firebase-auth:16.2.1' api 'com.google.firebase:firebase-firestore:18.2.0' api 'com.google.firebase:firebase-storage:16.1.0' api 'com.google.android.libraries.places:places:1.1.0'

答案setText给了我同样的问题 - 它一定是我认为的错误。但是我发现了一些提示。在onPlaceSelected中,您可以输入以下内容:
java的
EditText etPlace = (EditText) autocompleteFragment.getView().findViewById(R.id.places_autocomplete_search_input); etPlace.setHint(place.getAddress())

科特林
val etPlace = autocompleteFragment.view?.findViewById(R.id.places_autocomplete_search_input) as EditText etPlace.hint = place.address

另一答案我相信这是一个错误,因为让它像这样工作是没有意义的。什么工作设置其他自动完成的文本,但不是自己的。这必须是一个错误。
另一答案这是我正在使用的代码,它工作得非常好。
对build.gradle(应用程序级别)进行一些更改
将其添加到build.gradle:
android{ ... ext { googlePlayServicesVersion = "15.0.1" } }

添加这些依赖项:
dependencies { ... //Also if you're using any firebase dependencies make sure that the are up to date implementation 'com.google.android.gms:play-services-places:16.0.0' implementation 'com.google.android.libraries.places:places:1.1.0' } apply plugin: 'com.google.gms.google-services'

在xml布局中:
< fragment android:id="@+id/autocomplete_fragment" android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment" android:layout_width="match_parent" android:layout_height="wrap_content" />

活动中的代码:
private void initGooglePlacesApi() { // Initialize Places. Places.initialize(getApplicationContext(), "YOUR_API_KEY"); // Create a new Places client instance. PlacesClient placesClient = Places.createClient(getApplicationContext()); // Initialize the AutocompleteSupportFragment. AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment) getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment); autocompleteFragment.setHint(getString(R.string.select_location_search_bar)); //autocompleteFragment.setLocationRestriction(RectangularBounds.newInstance( //new LatLng(34.7006096, 19.2477876), //new LatLng(41.7488862, 29.7296986))); //Greece bounds autocompleteFragment.setCountry("gr"); // Specify the types of place data to return. autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ADDRESS, Place.Field.ADDRESS_COMPONENTS)); autocompleteFragment.setTypeFilter(TypeFilter.ADDRESS); // Set up a PlaceSelectionListener to handle the response. autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() { @Override public void onPlaceSelected(Place place) { if(place.getAddressComponents().asList().get(0).getTypes().get(0).equalsIgnoreCase("route")){ binding.textViewLocation.setText(place.getAddress()); //Works well location = place.getAddress(); }else{ //If user does not choose a specific place. AndroidUtils.vibratePhone(getApplication(), 200); TastyToast.makeText(getApplicationContext(), getString(R.string.choose_an_address), TastyToast.DEFAULT, TastyToast.CONFUSING); }Log.i(TAG, "Place: " + place.getAddressComponents().asList().get(0).getTypes().get(0) + ", " + place.getId() + ", " + place.getAddress()); }@Override public void onError(Status status) { Log.i(TAG, "An error occurred: " + status); } }); }

另一答案编辑:这是我更新的答案
# When you are using AutocompleteSupportFragment or AutocompleteActivity # in Fragments, do this: public class YourFragment extends Fragment { /.../ @Override public void onActivityResult (int requestCode,int resultCode, @Nullable Intent data){ # AUTOCOMPLETE_REQUEST_CODE is just a unique constant, define it if (requestCode == AUTOCOMPLETE_REQUEST_CODE) { if (resultCode == AutocompleteActivity.RESULT_OK) { Place place = Autocomplete.getPlaceFromIntent(data); // when resultcode is RESULT_OK mAddressEditText.setText(place.getName()); // Notice this line, update your editText up here }else if (resultCode == AutocompleteActivity.RESULT_ERROR) { Status status = Autocomplete.getStatusFromIntent(data); // Handle error } else if (resultCode == AutocompleteActivity.RESULT_CANCELED) { // Handle results if canceled } super.onActivityResult(requestCode, resultCode, data); } } /.../ } # If you are extending AppCompatActivity, you might want to do this # ONLY when you are already doing something in onActivityResult public class YourActivity extends AppCompatActivity{ /.../ @Override public void onActivityResult (int requestCode,int resultCode,@Nullable Intent data){ # your logic here. /.../ # if you are already overriding onActivityResult, # do not forget to put this line super.onActivityResult(requestCode, resultCode, data); } /.../ }

我也遇到了这个问题。原来你无论如何都必须覆盖它并实现它,无论是使用AutocompleteSupportFragment还是AutocompleteActivity,如果你在Fragments中工作。
【Android Place自动填充片段(无法设置文字)】如果你正在使用AppCompatActivity你不必实现它,但如果你已经超越onActivityResult做某事,不要忘记调用基本方法super.onActivityResult

    推荐阅读