web-dev-qa-db-fra.com

Android Placer le fragment de saisie semi-automatique: impossible de définir le texte

Google a récemment mis à jour son SDK Google Adresses pour Android, alors maintenant je mets également à jour mon code. J'essaie d'utiliser le AutocompleteSupportFragment pour permettre à l'utilisateur de définir son adresse.

Voici mon code:

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

Dans le SDK précédent, le fragment définissait automatiquement le texte à l'adresse sélectionnée. Cela ne fonctionne pas dans le nouveau SDK (je ne sais pas si c'est intentionnel ou non). J'essaie donc de le régler manuellement à la place. Comme vous pouvez le voir dans les commentaires de mon code, l'utilisation de setText fonctionne très bien en dehors des écouteurs. À l'intérieur de l'auditeur, ce n'est pas le cas.

Suis-je en train de faire quelque chose de mal ou est-ce un bug?

EDIT: Si longtemps et je n'arrive toujours pas à obtenir une solution appropriée à cela. Pour être parfaitement clair, je peux obtenir l'adresse correctement à partir du fragment, la seule chose qui ne fonctionne pas est setText.

Cependant, comme certaines réponses indiquent qu'ils n'obtiennent pas le même problème, j'ai commencé à penser que cela pourrait être lié aux versions de la bibliothèque que j'utilise?

Ce sont les bibliothèques que j'ai dans mon 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'
6
ProWi

Je pense que c'est un bug, car cela n'a aucun sens de le faire fonctionner comme ça. Ce qui fonctionne, c'est définir les autres textes de saisie semi-automatique, mais pas les siens. Ce doit être un bug.

0
user1556690

EDIT: voici ma réponse mise à jour

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

J'avais aussi le problème. Il s'avère que vous AVEZ pour remplacer cela et l'implémenter de toute façon, que vous utilisiez AutocompleteSupportFragment ou AutocompleteActivity si vous travaillez dans Fragments .

Si vous utilisez AppCompatActivity vous n'avez pas à l'implémenter, mais si vous êtes déjà en train de remplacer onActivityResult pour faire quelque chose, n'oubliez pas d'appeler la méthode de base super.onActivityResult

0
Aldrian Kwan

J'ai trouvé une solution assez simple ... il suffit de retarder un peu le moment où vous définissez le texte dans EditText. Donc, dans votre PlaceSelectionListener, procédez comme suit:

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

PS: c'est du code kotlin mais c'est presque similaire en Java

0
Matthias

J'ai essayé la solution de CacheMeOutside mais cela n'a pas fonctionné du tout. J'ai donc décidé d'essayer la solution de Matthias et cela a fonctionné parce que le texte est effectivement défini puis supprimé immédiatement pour une raison quelconque. Un petit retard le corrige. Le retard peut être aussi petit que 1 milliseconde.

Si ma solution ne fonctionne pas pour vous, vous pouvez essayer d'expérimenter le retard. Il semble également que cela n'interrompt pas le rendu de la vue, vous pouvez donc définir à tout moment.

private lateinit var autocomplete: AutocompleteSupportFragment

        override fun onPlaceSelected(place: Place) {
            Timer("SetAddress", false).schedule(1) {
                autocomplete.setText(place.address)
            }
        }

L'extrait de code dans Kotlin. Si votre code est en Java, trouvez simplement un instrument pour retarder l'exécution du code pendant un certain temps.

0
Victor K.

obtenir la référence de AutoCompleteFragment, puis définir le texte sur le fragment de saisie semi-automatique comme

autoCompleteFragment.setText("Address")

pour référence, vous pouvez consulter la documentation

https://developers.google.com/Android/reference/com/google/Android/gms/location/places/ui/PlaceAutocompleteFragment

0
Abdul