web-dev-qa-db-ja.com

Android Place Autocomplete Fragment:Unable to set text

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'
6
ProWi

これはバグだと思います。このように機能させるのは意味がありません。機能するのは、他のオートコンプリートのテキストを設定することですが、独自のテキストは設定しません。これはバグである必要があります。

0
user1556690

編集:ここに私の更新された答えがあります

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

私も問題を抱えていました。 [〜#〜] have [〜#〜]これをオーバーライドして実装します。フラグメントで作業している場合はAutocompleteSupportFragmentまたはAutocompleteActivityを使用します。 。

AppCompatActivityを使用している場合は実装する必要はありませんが、すでにonActivityResultをオーバーライドして何かをしている場合は、基本メソッドsuper.onActivityResultを呼び出すことを忘れないでください。

0
Aldrian Kwan

EditTextにテキストを設定した瞬間に少しだけ遅延する、かなり単純な解決策を見つけました。したがって、PlaceSelectionListenerでは、次のようにします。

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

PS:これはkotlinコードですが、Javaでもほぼ同じです

0
Matthias

私は CacheMeOutsideのソリューション を試しましたが、まったく機能しませんでした。それで、私は Matthiasの解 を試すことにしました。テキストは実際に設定され、何らかの理由ですぐに削除されるため、うまくいきました。少し遅れて修正します。遅延は1ミリ秒まで小さくすることができます。

私の解決策がうまくいかない場合は、遅延を試してみることができます。また、ビューのレンダリングを停止しないようですので、いつでも設定できます。

private lateinit var autocomplete: AutocompleteSupportFragment

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

Kotlinのコードスニペット。コードがJavaの場合は、コードの実行をしばらく遅らせるための手段を見つけてください。

0
Victor K.

autoCompleteFragmentの参照を取得し、次のようにテキストをオートコンプリートフラグメントに設定します

autoCompleteFragment.setText("Address")

参考のために、ドキュメントを見ることができます

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

0
Abdul