应用程序崩溃与FragmentManager使用谷歌地图时,更换 [英] App crashes with FragmentManager Replace when using GoogleMaps
问题描述
我用下面的code加载取决于碎片在其项目已在NavigationDrawer选择,但是MapFragment包含谷歌地图碎片在它的内部,并试图打开它的第二次后崩溃。
这里的code我使用:
@覆盖
公共无效onNavigationDrawerItemSelected(INT位置){
//更新替换片段的主要内容
FragmentManager fragmentManager = getSupportFragmentManager();
如果(位置== 0){
fragmentManager.beginTransaction()
.replace(R.id.container,MapFragment.newInstance(一,B))
。承诺();
}
其他 {
fragmentManager.beginTransaction()
.replace(R.id.container,PlaceholderFragment.newInstance(位置+ 1))
。承诺();
}
}
和这里的日志:
03-01 14:18:25.870 27175-27175 / com.br.appname E /:设备驱动程序API匹配
设备驱动程序API版本:23
用户空间API版本:23
03-01 14:18:25.870 27175-27175 / com.br.appname E /:马里:版本= Linux的r3p2-01rel3 BUILD_DATE =周三10月30日9时36分10秒KST 2013
03-01 14:19:126.55 27175-27175 / com.br.appname E / AndroidRuntime:致命异常:主要
android.view.InflateException:二进制XML文件中的行#13:错误充气类片段
在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:719)
在android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
在android.view.LayoutInflater.rInflate(LayoutInflater.java:769)
在android.view.LayoutInflater.inflate(LayoutInflater.java:498)
在android.view.LayoutInflater.inflate(LayoutInflater.java:398)
在com.br.appname.fragments.MapFragment.onCreateView(MapFragment.java:74)
在android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
在android.support.v4.app.FragmentManagerImpl $ 1.运行(FragmentManager.java:440)
在android.os.Handler.handleCallback(Handler.java:730)
在android.os.Handler.dispatchMessage(Handler.java:92)
在android.os.Looper.loop(Looper.java:137)
在android.app.ActivityThread.main(ActivityThread.java:5419)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:525)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1209)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
在dalvik.system.NativeStart.main(本机方法)
致:java.lang.IllegalArgumentException:如果二进制XML文件中的行#13:重复ID 0x7f070055,标记为空,或父母身份证0x7f070054与另一个片段com.google.android.gms.maps.MapFragment
在android.app.Activity.onCreateView(Activity.java:4971)
在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:695)
在android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
在android.view.LayoutInflater.rInflate(LayoutInflater.java:769)
在android.view.LayoutInflater.inflate(LayoutInflater.java:498)
在android.view.LayoutInflater.inflate(LayoutInflater.java:398)
在com.br.appname.fragments.MapFragment.onCreateView(MapFragment.java:74)
在android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
在android.support.v4.app.FragmentManagerImpl $ 1.运行(FragmentManager.java:440)
在android.os.Handler.handleCallback(Handler.java:730)
在android.os.Handler.dispatchMessage(Handler.java:92)
在android.os.Looper.loop(Looper.java:137)
在android.app.ActivityThread.main(ActivityThread.java:5419)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:525)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1209)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
在dalvik.system.NativeStart.main(本机方法)
这仅发生与MapFragment。 PlaceholderFragment工作得很好。
更新
fragment_map.xml
< RelativeLayout的的xmlns:机器人=http://schemas.android.com/apk/res/android
的xmlns:工具=http://schemas.android.com/tools
机器人:layout_width =match_parent
机器人:layout_height =match_parent
工具:上下文=com.br.remotepark.fragments.MapFragment>
< com.sothree.slidinguppanel.SlidingUpPanelLayout
机器人:ID =@ + ID / sliding_layout
机器人:layout_width =match_parent
机器人:layout_height =match_parent
机器人:重力=底和GT;
<片段
机器人:ID =@ + ID /图
机器人:layout_width =match_parent
机器人:layout_height =match_parent
机器人:名称=com.google.android.gms.maps.MapFragment/>
<的LinearLayout
机器人:layout_width =match_parent
机器人:layout_height =match_parent
机器人:后台=#EEE
机器人:方向=垂直
机器人:可点击=真
机器人:可聚焦=假>
<的LinearLayout
机器人:layout_width =match_parent
机器人:layout_height =68dp
机器人:方向=横向>
<的TextView
机器人:ID =@ + ID /名称
机器人:layout_width =0dp
机器人:layout_height =match_parent
机器人:layout_weight =1
机器人:TEXTSIZE =14sp
机器人:重力=center_vertical
机器人:以下属性来=10dp/>
<按钮
机器人:ID =@ + ID /遵循
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =match_parent
机器人:TEXTSIZE =14sp
机器人:重力=center_vertical |右
机器人:paddingRight =10dp
机器人:以下属性来=10dp/>
< / LinearLayout中>
< / LinearLayout中>
< /com.sothree.slidinguppanel.SlidingUpPanelLayout>
< / RelativeLayout的>
重复的ID问题与使用嵌套的片段不正确的方法。
来源: http://developer.android.com/about/版本/ Android的4.2.html#NestedFragments
注意::你不能夸大布局成一个片段时,该布局包括
<片断>
。当添加到片段动态嵌套片段仅支持
所以,你的 fragment_map.xml
不能直接包含 com.google.android.gms.maps.MapFragment
。与的FrameLayout
id为替换它 map_container
和尝试是这样的:
公共类MyFragmentWithMap扩展片段{
私人MapFragment片段;
私人GoogleMap的地图;
@覆盖
公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState){
返回inflater.inflate(R.layout.fragment_map,集装箱,假);
}
@覆盖
公共无效onActivityCreated(包savedInstanceState){
super.onActivityCreated(savedInstanceState);
FragmentManager FM = getChildFragmentManager();
片段=(MapFragment)fm.findFragmentById(R.id.map_container);
如果(片段== NULL){
片段= MapFragment.newInstance();
fm.beginTransaction()代替(R.id.map_container,片段).commit()。
}
}
@覆盖
公共无效onResume(){
super.onResume();
setUpMapIfNeeded();
}
// ...
}
请注意使用 getChildFragmentManager
。
I'm using the following code to load fragments depending on which item has been selected on NavigationDrawer, however the MapFragment contains Google Maps fragment inside of it and it crashes after trying to open it for the second time.
Here's the code I'm using:
@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
FragmentManager fragmentManager = getSupportFragmentManager();
if (position == 0) {
fragmentManager.beginTransaction()
.replace(R.id.container, MapFragment.newInstance("a", "b"))
.commit();
}
else {
fragmentManager.beginTransaction()
.replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
.commit();
}
}
And here's the log:
03-01 14:18:25.870 27175-27175/com.br.appname E/﹕ Device driver API match
Device driver API version: 23
User space API version: 23
03-01 14:18:25.870 27175-27175/com.br.appname E/﹕ mali: REVISION=Linux-r3p2-01rel3 BUILD_DATE=Wed Oct 30 09:36:10 KST 2013
03-01 14:19:12.655 27175-27175/com.br.appname E/AndroidRuntime﹕ FATAL EXCEPTION: main
android.view.InflateException: Binary XML file line #13: Error inflating class fragment
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:719)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)
at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
at com.br.appname.fragments.MapFragment.onCreateView(MapFragment.java:74)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: Binary XML file line #13: Duplicate id 0x7f070055, tag null, or parent id 0x7f070054 with another fragment for com.google.android.gms.maps.MapFragment
at android.app.Activity.onCreateView(Activity.java:4971)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:695)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)
at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
at com.br.appname.fragments.MapFragment.onCreateView(MapFragment.java:74)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
at dalvik.system.NativeStart.main(Native Method)
This happens only with the MapFragment. PlaceholderFragment works just fine.
UPDATE
fragment_map.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.br.remotepark.fragments.MapFragment">
<com.sothree.slidinguppanel.SlidingUpPanelLayout
android:id="@+id/sliding_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="bottom">
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.MapFragment" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#eee"
android:orientation="vertical"
android:clickable="true"
android:focusable="false">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="68dp"
android:orientation="horizontal">
<TextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:textSize="14sp"
android:gravity="center_vertical"
android:paddingLeft="10dp" />
<Button
android:id="@+id/follow"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textSize="14sp"
android:gravity="center_vertical|right"
android:paddingRight="10dp"
android:paddingLeft="10dp" />
</LinearLayout>
</LinearLayout>
</com.sothree.slidinguppanel.SlidingUpPanelLayout>
</RelativeLayout>
Duplicate ID issue is related to incorrect way of using nested fragments.
From: http://developer.android.com/about/versions/android-4.2.html#NestedFragments
Note: You cannot inflate a layout into a fragment when that layout includes a
<fragment>
. Nested fragments are only supported when added to a fragment dynamically.
So your fragment_map.xml
cannot directly contain com.google.android.gms.maps.MapFragment
. Replace it with FrameLayout
with id map_container
and try something like this:
public class MyFragmentWithMap extends Fragment {
private MapFragment fragment;
private GoogleMap map;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_map, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
FragmentManager fm = getChildFragmentManager();
fragment = (MapFragment) fm.findFragmentById(R.id.map_container);
if (fragment == null) {
fragment = MapFragment.newInstance();
fm.beginTransaction().replace(R.id.map_container, fragment).commit();
}
}
@Override
public void onResume() {
super.onResume();
setUpMapIfNeeded();
}
// ...
}
Note the use of getChildFragmentManager
.
这篇关于应用程序崩溃与FragmentManager使用谷歌地图时,更换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!