更新
我的用例是通过将MapFragment
直接放在xml中而不是稍后添加来解决的 - 但是我仍然保持问题是开放的,因为我仍然不清楚为什么以编程方式添加它会失败。 / p>
原始问题
我有一个CardView
的列表,它是RecyclerViewAdapter
中的数据。
在我的一张卡片中,我将SupportMapFragment
添加到 FrameLayout 中,其中ID为 map_container 的布局中为卡片充气。
map_card.xml
<merge
android:id="@+id/map_card"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="3dp"
card_view:cardElevation="2sp"
card_view:cardUseCompatPadding="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical">
<!-- Root layout for the card content that is created dynamically -->
<LinearLayout
android:id="@+id/card_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:id="@+id/map_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
</merge>
这是我的适配器的工作方式
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
FrameLayout frame = new FrameLayout(parent.getContext());
frame.setLayoutParams(new RecyclerView.LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT));
return new ViewHolder(frame);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
ViewGroup container = (ViewGroup) viewHolder.itemView;
container.removeAllViews();
CardView cardView = cards.get(position);
ViewGroup parent = (ViewGroup) cardView.getParent();
if (parent != null) {
parent.removeView(cardView);
}
container.addView(cardView);
((CustomCard)cardView).onCardBind(fragment);
}
我正在使用
获取MapFragmentGoogleMapOptions options = new GoogleMapOptions();
SupportMapFragment mapFragment = SupportMapFragment.newInstance(options);
然后我需要将 MapFragment 添加到卡片中......
如果卡片从一开始就在屏幕上可见 - 即,它是列表中的第一个或第二个项目 - 正在进行
FragmentManager fragmentManager = fragment.getChildFragmentManager();
fragmentManager.beginTransaction().add(R.id.map_container, mapFragment).commitAllowingStateLoss();
作品!
但是如果该卡成为第3个项目并因此最初不可见相同的代码失败,因为片段管理器无法找到 map_container
ava.lang.IllegalArgumentException: No view found for id 0x7f0d018d (com.myapp.android:id/map_container) for fragment MapFragment{2b012f2b #0 id=0x7f0d018d}
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:886)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.app.BackStackRecord.run(BackStackRecord.java:833)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1454)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:447)
我尝试将代码移动到卡OnLayout
方法,在适配器onBindViewHolder
中调用它 - 在添加视图之前,添加视图后 - 我总是得到相同的异常 - 我怎样才能使它发挥作用?
答案 0 :(得分:1)
你应该在关闭之前销毁视图
fm = fragment.getChildFragmentManager();
mMapFragment = (SupportMapFragment) fm.findFragmentById(map.getId());
fm.beginTransaction().remove(mMapFragment).commitAllowingStateLoss();
container.removeView(map);