6

タブを使用してアプリケーションを作成していて、タブの 1 つにマップがあり、そこからマップを開くと正常に動作し、別のタブにアクセスすると正常に動作しますが、マップ タブに戻るとアプリがクラッシュしますこのエラーで。

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>
4

5 に答える 5

18

問題は、Google マップ v2 フラグメントを XML で宣言しているため、XML を拡張するたびに新しいフラグメントが作成されることです。ただし、フラグメントの ID は XML でハードコーディングされているため、既に実行されているものと同じ ID を持つ新しいフラグメントを作成しようとします。実行中の 2 つのフラグメントが同じ ID を持つことはできないため、アプリがクラッシュします。

これを修正する最善の方法は、プログラムでマップ フラグメントを作成することです。この良い例は、Google マップのサンプル プロジェクトの 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()andから呼び出してonDestroyView()、古いマップが強制終了されるようにします。

ご覧のとおり、これは一種のハックであり、XML を使用する代わりにプログラムでアプリを作成するのが最善です。

于 2013-07-01T13:43:32.800 に答える
0

1 つのマップ フラグメントが既に作成されており、マップ ページに戻ろうとすると、その上に別のフラグメントを作成しようとします。以下のコードは最終的に私にとってはうまくいきます:

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"/>

MapFragment の代わりに SupportMapFragment を使用したことに注意してください。

ジャワ:

 @Override
public void onDestroyView() {
    super.onDestroyView();
    Fragment f = getActivity().getSupportFragmentManager().findFragmentById(R.id.map);
    if (f != null)
        getFragmentManager().beginTransaction().remove(f).commit();
}
于 2015-11-24T17:54:19.957 に答える
-1

あなたが提示したコードで最初に目にする問題は、次の行です。

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

SupportMapFragment通常の を使用してオブジェクトを取得しようとしていますFragmentManager。これは間違っています。SupportMapFragmentオブジェクトを取得するには、次のように使用する必要がありますSupportFragmentManager

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

しかし、あなたが今経験している問題は、まだこの間違いから派生したものではないと思います。google-play-servicesライブラリのgoogle-support-v4ライブラリを間違った方法で参照していると思います。

Google Map API V2アプリケーションに追加する方法について書いたこのブログ投稿をご覧ください。

Google マップ 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" />
于 2013-04-09T09:00:42.433 に答える