Фрагмент автозаполнения в Android Place: невозможно установить текст - PullRequest
0 голосов
/ 03 февраля 2019

Google недавно обновил свой Places SDK для 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'

Ответы [ 5 ]

0 голосов
/ 09 августа 2019

Я нашел довольно простое решение ... просто немного задержать момент, когда вы установите текст в EditText.Так что в вашем PlaceSelectionListener просто сделайте это следующим образом:

Handler().postDelayed({
    mAddressEditText.setText(place.getAddress());
}, 300)

PS: это код kotlin, но он почти аналогичен в Java

0 голосов
/ 28 апреля 2019

Это код, который я использую, и он отлично работает.

Внесите некоторые изменения в 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);
            }
        });
    }
0 голосов
/ 10 апреля 2019

setText дает мне ту же проблему - я думаю, что это ошибка.Однако я нашел немного работы с подсказкой.В свой onPlaceSelected вы можете поместить следующее:

Java

EditText etPlace = (EditText) autocompleteFragment.getView().findViewById(R.id.places_autocomplete_search_input);
etPlace.setHint(place.getAddress())

Kotlin

val etPlace = autocompleteFragment.view?.findViewById(R.id.places_autocomplete_search_input) as EditText
etPlace.hint = place.address
0 голосов
/ 28 апреля 2019

РЕДАКТИРОВАТЬ: вот мой обновленный ответ

# 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, если вы работаете с фрагментами.

Если вы используете AppCompatActivity, вы этого не делаетедолжны реализовать это, но если вы уже перебираете onActivityResult что-то сделать, не забудьте вызвать базовый метод super.onActivityResult

0 голосов
/ 28 февраля 2019

Я считаю, что это ошибка, потому что не имеет смысла так работать.То, что работает, это установить другие тексты автозаполнения, но не свой собственный.Это должно быть ошибка.

...