我正在使用新的Places SDK。我的build.gradle:
implementation 'com.google.android.libraries.places:places:1.0.0'
我的代码:
FragmentManager supportFragmentManager = getChildFragmentManager();
FragmentTransaction ft = supportFragmentManager.beginTransaction();
if(mAutocompleteFragment == null) {
mAutocompleteFragment = new AutocompleteSupportFragment();
ft.add(R.id.places_container, mAutocompleteFragment, AutocompleteSupportFragment.class.getSimpleName());
ft.commit();
}
List<Place.Field> places = new ArrayList<>();
places.add(Place.Field.ID);
places.add(Place.Field.NAME);
places.add(Place.Field.ADDRESS);
mAutocompleteFragment.setPlaceFields(places); //throws NPE getView() is null
引发NPE,因为它试图在最后一个方法中将视图设置为启用,并且该视图为null。我怀疑该片段的生命周期尚未调用(onViewCreated)。我将如何强制生命周期或等待片段完全循环?
但是,当我选择自动完成支持片段时,会得到:
android.content.ActivityNotFoundException:无法找到显式的活动类{com.activehours.debug / com.google.android.libraries.places.widget.AutocompleteActivity};您是否在AndroidManifest.xml中声明了此活动?
这是我的清单:
<activity
android:name="com.google.android.libraries.places.widget.AutocompleteActivity"
android:theme="@style/PlacesAutocompleteThemeOverlay">
</activity>
documentation没有提及将活动纳入我的清单。救命!
编辑:通过扩展类,我得到了NPE:
public class AHAutocompleteSupportFragment extends AutocompleteSupportFragment
{
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
List<Place.Field> places = new ArrayList<>();
places.add(Place.Field.ID);
places.add(Place.Field.NAME);
places.add(Place.Field.ADDRESS);
this.setPlaceFields(places);
}
}
但是,我仍然收到“清单中未声明的活动”。
答案 0 :(得分:0)
您不必自己实例化片段...
mAutocompleteFragment = new AutocompleteSupportFragment();
您是否有理由不只是在现有活动中使用该片段?
下面是我在应用程序中使用的代码,新的AutocompleteSupportFragment运行得很好。
<android.support.v7.widget.CardView
android:layout_width="0dp"
android:layout_height="@dimen/shop_search_search_area_height"
android:layout_marginTop="@dimen/shop_search_search_area_margin"
android:layout_marginStart="@dimen/shop_search_search_area_margin"
app:cardElevation="8dp"
android:layout_weight="4">
<fragment
android:id="@+id/shop_search_autocomplete_fragment"
android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/shop_search_voice_icon"
android:layout_width="@dimen/shop_search_mic_size"
android:layout_height="@dimen/shop_search_mic_size"
android:layout_marginEnd="@dimen/shop_search_mic_margin_right"
android:contentDescription="@null"
android:onClick="@{() -> model.voicePlaceSearch()}"
android:src="@drawable/ic_mic_24dp_gray" />
</fragment>
</android.support.v7.widget.CardView>
然后在我的代码中保留它,我将使用与教程提供的代码相同的代码...
AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
getSupportFragmentManager().findFragmentById(R.id.shop_search_autocomplete_fragment);
答案 1 :(得分:0)
您很有可能必须添加一个intent-filter
,以便它可以找到期望的内容:
<activity
android:name="com.google.android.libraries.places.widget.AutocompleteActivity"
android:theme="@style/PlacesAutocompleteThemeOverlay">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
</activity>