谷歌地图V2的Android错误膨化类片段错误(Google Map V2 android erro

2019-08-20 19:37发布

我创建带有标签的应用程序,我已经映射的标签之一,当我打开地图,从它工作正常,当我访问了一些其他选项卡那个时候也能正常工作,但是当我回来的地图标签应用程序崩溃与此错误。

04-09 14:10:43.866: E/AndroidRuntime(28184): android.view.InflateException: Binary XML file line #42: Error inflating class fragment
04-09 14:10:43.866: E/AndroidRuntime(28184):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697)
04-09 14:10:43.866: E/AndroidRuntime(28184):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
04-09 14:10:43.866: E/AndroidRuntime(28184):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
04-09 14:10:43.866: E/AndroidRuntime(28184):    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
04-09 14:10:43.866: E/AndroidRuntime(28184):    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
04-09 14:10:43.866: E/AndroidRuntime(28184):    at com.research.fragmenttabstudy.tabA.TodaysDealLocation.onCreateView(TodaysDealLocation.java:43)

这里是我的代码:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        Log.d("err","todaysdeal location");
        Log.d("err","todaysdeal location"+inflater.toString()+" "+container.toString()+" ");
        super.onCreateView(inflater, container, savedInstanceState); 
//      map.clear();
        View view = inflater.inflate(R.layout.todays_deal_location, container,
                false);

        Log.d("err",view.toString());
        back = (ImageView) view.findViewById(R.id.list);
        back.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                // TODO Auto-generated method stub
                // Constants.passcode_chk = 0;
                // finish();
                mActivity.popFragments();
            }
        });
        return view;
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        map = ((SupportMapFragment) getFragmentManager().findFragmentById(
                R.id.mapp)).getMap();
        map.setMapType(GoogleMap.MAP_TYPE_NORMAL);

    }

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/topbar" />

    <!-- <ImageView -->
    <!-- android:id="@+id/deallistmenu" -->
    <!-- android:layout_width="wrap_content" -->
    <!-- android:layout_height="wrap_content" -->
    <!-- android:layout_marginLeft="5dp" -->
    <!-- android:layout_marginTop="9dp" -->
    <!-- android:src="@drawable/deallist_menubtn" /> -->

    <ImageView
        android:id="@+id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="7dp"
        android:layout_marginTop="7dp"
        android:src="@drawable/map_list" />

    <RelativeLayout
        android:id="@+id/frameLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/imageView1"
        android:layout_marginTop="-4.8dp" >

        <!-- box layout.................................................................... -->


        <!-- box layout.................................................................... -->

        <fragment
            android:id="@+id/mapp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/tv_location"
            android:name="com.google.android.gms.maps.SupportMapFragment" />

        <!-- <ZoomControls -->
        <!-- android:id="@+id/zoomControls" -->
        <!-- android:layout_width="wrap_content" -->
        <!-- android:layout_height="wrap_content" -->
        <!-- android:layout_alignParentBottom="true" -->
        <!-- android:layout_alignParentLeft="true" -->
        <!-- android:layout_marginBottom="30dp" -->
        <!-- android:layout_marginLeft="100dp" /> -->

    </RelativeLayout>

    <TextView
        android:id="@+id/barTitle"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:gravity="center"
        android:lines="1"
        android:maxLines="1"
        android:paddingLeft="50dip"
        android:paddingRight="55dip"
        android:singleLine="true"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@android:color/white"
        android:textSize="18dp" />

</RelativeLayout>

Answer 1:

你的问题是,你已经宣布XML谷歌地图V2片段,所以每次充气的XML时它使一个新片段。 然而,该片段的id是硬编码在XML,所以它会尝试用相同的ID已经运行了一个创建新片段。 两个运行片段不能有相同的ID,所以应用程序崩溃。

解决这个问题的最好办法是使地图片段编程。 这方面的一个很好的例子可以在谷歌地图示例项目的一部分ProgrammaticDemoActivity.java中找到。

但是,如果由于某种原因,你必须在XML声明你的片段,你可以把它用在你离开的看法杀老地图片段工作,因此新人们可以创建。

你可以这样做:

private void killOldMap() {
    SupportMapFragment mapFragment = ((SupportMapFragment) getSherlockActivity()
            .getSupportFragmentManager().findFragmentById(R.id.map));

    if(mapFragment != null) {
        FragmentManager fM = getFragmentManager();
        fM.beginTransaction().remove(mapFragment).commit();
    }

}

然后从调用它onDetach()onDestroyView()以确保老地图被杀害。

正如你所看到的,这是怎样的一个黑客,你是最好的关闭只是编程让您的应用程序,而不是使用XML。



Answer 2:

试试这个...

调用从onDetach()和onDestroyView此功能()杀死存在片段事务。

private void commitMaps() {
    if (null != mapFragment) {
        getFragmentManager().beginTransaction().remove(mapFragment).commitAllowingStateLoss();
    }
}

有时你会得到“IllegalStateException异常:以后的onSaveInstanceState无法执行此操作”,如果你提交()存在地图交易。 为了避免这种情况的异常,你应该使用commitAllowingStateLoss()当您删除存在交易。

区别commit()和commitAllowingStateLoss()



Answer 3:

确保您的活动来延长片段活动和替换

map=((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getMap();

并删除“ android:layout_below="@+id/tv_location" because it is inside relative layout

这一去,让我知道。



Answer 4:

一个地图片段已经被创建,当你试图让回到地图页面,它试图建立在它的顶部的另一个片段。 下面的代码最终被工作对我罚款:

XML:

 <fragment 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" android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment"/> 

请注意,我用SupportMapFragment代替MapFragment。

JAVA:

 @Override
public void onDestroyView() {
    super.onDestroyView();
    Fragment f = getActivity().getSupportFragmentManager().findFragmentById(R.id.map);
    if (f != null)
        getFragmentManager().beginTransaction().remove(f).commit();
}


Answer 5:

我在这里看到你提供的代码的第一个问题是这样的一行:

map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.mapp)).getMap();

你想获得一个SupportMapFragment使用通常的对象FragmentManager 。 这是错误的。 要获得SupportMapFragment你必须使用对象SupportFragmentManager这样的:

map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapp)).getMap();

但我的猜测是,你现在的experiance问题都没有从这个错误的。 我想你引用google-play-services的图书馆google-support-v4库走错了路。

你可以看看这个博客文章中,我就怎么加写了Google Map API V2到你的应用程序:

谷歌地图API V2

更新:

如果你分钟SDK是11,那么你可以改变片段这样的代码:

<fragment
        android:id="@+id/mapp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/tv_location"
        android:name="com.google.android.gms.maps.MapFragment" />


文章来源: Google Map V2 android error Inflating class fragment error