应用程序崩溃与FragmentManager使用谷歌地图时,更换 [英] App crashes with FragmentManager Replace when using GoogleMaps

查看:157
本文介绍了应用程序崩溃与FragmentManager使用谷歌地图时,更换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用下面的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:机器人=htt​​p://schemas.android.com/apk/res/android
    的xmlns:工具=htt​​p://schemas.android.com/tool​​s
    机器人: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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆