gpt4 book ai didi

android - 通过覆盖 onCreateView() 将 SupportMapFragment 放入另一个 Fragment 的方法

转载 作者:行者123 更新时间:2023-11-29 16:05:32 25 4
gpt4 key购买 nike

我将尝试描述我的情况:

我有 MyFragment extends Fragment 并覆盖了 onCreateView()

MyFragment.java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, null);
//some manipulation with view
return view;

my_fragment.xml

<LinearLayout
.....
>
<com.example.widgets.MyMapWidget
android:id="@+id/my_map"
android:layout_width="match_parent"
android:layout_height="300dp"
/>
</LinearLayout>

MyMapWidget.java

public class MyMapWidget extends LinearLayout {

public MyMapWidget(final Context context, AttributeSet attrs) {
super(context, attrs);
((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.widget_map, this, true);
...
}

widget_map.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<!-- Some another views-->
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/my_map_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment"
/>
<!-- Some another views-->
</LinearLayout>

当我第一次显示 MyFragment 时 - 一切正常。但是如果然后我显示另一个 fragment (清理返回堆栈)然后再次显示 MyFragment - 我得到了 Inflate Exception

Stacktrase

android.view.InflateException: Binary XML file line #151: Error inflating class <unknown>
at android.view.LayoutInflater.createView(LayoutInflater.java:606)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at `com.***.****.fragments.MyFragment.onCreateView(MyFragment.java:78)`

MyFragment.java 中的第 78 行(方法 onCreateView)

View view = inflater.inflate(R.layout.my_fragment, null);

my_fragment.xml 中删除 MyMapWidget 解决了问题。但我有一些问题:

  1. 为什么会这样?
  2. 我可以这样显示 map 吗?
  3. 您是否知道另一种方式如何将 map 呈现为自己的 Fragment 的一部分?

注意:我检查了类似 question 的答案,但无法解决我的情况。

最佳答案

您可以像这样将 map 放在它自己的 fragment 中:

public class GoogleMapFragment extends MapFragment {

private static final String SUPPORT_MAP_BUNDLE_KEY = "MapOptions";

public GoogleMapFragment() {
mCallback = null;
}

public static interface OnGoogleMapFragmentListener {
void onMapReady(GoogleMap map);
}


@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
}

public static GoogleMapFragment newInstance() {
return new GoogleMapFragment();
}

public static GoogleMapFragment newInstance(GoogleMapOptions options) {
Bundle arguments = new Bundle();
arguments.putParcelable(SUPPORT_MAP_BUNDLE_KEY, options);

GoogleMapFragment fragment = new GoogleMapFragment();
fragment.setArguments(arguments);
return fragment;
}

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallback = (OnGoogleMapFragmentListener) getActivity();
} catch (ClassCastException e) {
throw new ClassCastException(getActivity().getClass().getName()
+ " must implement OnGoogleMapFragmentListener");
}
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
if (mCallback != null) {
mCallback.onMapReady(getMap());
}
return view;
}

private OnGoogleMapFragmentListener mCallback;
}

然后像这样将其添加到您的 Activity 中:

 // create a new map
mapsFragment = GoogleMapFragment.newInstance();

// Then we add it using a FragmentTransaction.
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(android.R.id.content, mapsFragment, FRAGMENT_MAP_TAG);
fragmentTransaction.commit();

让您的 Activity 实现 OnGoogleMapFragmentListener,然后在添加 map 并准备就绪时调用以下方法:

@Override
public void onMapReady(GoogleMap map) {
//add markers or whatever
}

希望这对您更好地控制您的 mapfragment 有用。

关于android - 通过覆盖 onCreateView() 将 SupportMapFragment 放入另一个 Fragment 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18962372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com