使用ViewPager时,Android View InflateException

时间:2015-04-24 16:28:12

标签: android android-viewpager layout-inflater supportmapfragment

我正在尝试在ViewPager中使用MapFragment。虽然我将FragmentManager定义为SupportFragmentManager,但如果我滑动到包含MapFragment的页面,我会看到InflateException。我阅读了大部分提到这个问题的标题,但还没有看到解决方案。我希望你可以。这是我的MapFragment类的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <fragment
        class="com.google.android.gms.maps.SupportMapFragment"
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginLeft="7dp"
        android:orientation="vertical"
        android:gravity="left">

        <ImageButton
            android:id="@+id/searchButton"
            android:background="@drawable/search_button"
            android:layout_marginTop="10dp"
            android:layout_width="50dip"
            android:layout_height="50dip"
            android:layout_alignParentTop="true"/>

        <ImageButton
            android:id="@+id/originButton"
            android:background="@drawable/origin_button"
            android:layout_marginBottom="10dp"
            android:layout_marginRight="7dp"
            android:layout_width="50dip"
            android:layout_height="50dip"
            android:layout_alignParentBottom="true"/>

        <ImageButton
            android:id="@+id/earthButton"
            android:background="@drawable/earth_button"
            android:layout_marginBottom="10dp"
            android:layout_width="50dip"
            android:layout_height="50dip"
            android:layout_alignParentBottom="true"
            android:layout_toRightOf="@id/originButton"/>


    </RelativeLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_marginRight="14dp"
        android:orientation="vertical"
        android:gravity="right" >

        <ImageButton
            android:id="@+id/plusButton"
            android:background="@drawable/plus_button"
            android:layout_centerInParent="true"
            android:layout_width="50dip"
            android:layout_height="50dip"/>

        <View
            android:layout_width="0dp"
            android:layout_height="7dp"
            android:layout_weight="1"/>

        <ImageButton
            android:id="@+id/minusButton"
            android:background="@drawable/minus_button"
            android:layout_centerInParent="true"
            android:layout_width="50dip"
            android:layout_height="50dip"/>

    </LinearLayout>
</RelativeLayout>

日志:

Process: net.geotune.app, PID: 17582
            android.view.InflateException: Binary XML file line #8: Error inflating class fragment
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
            at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.inflate(CalligraphyLayoutInflater.java:60)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
            at net.geotune.app.dorukhan.MapFragment.onCreateView(MapFragment.java:177)
            at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
            at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1302)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:729)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
            at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:486)
            at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
            at android.support.v4.view.ViewPager.populate(ViewPager.java:1073)
            at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:555)
            at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:514)
            at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:495)
            at net.geotune.app.main.MainPager.onTabSelected(MainPager.java:95)
            at com.android.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java:578)
            at com.android.internal.app.ActionBarImpl$TabImpl.select(ActionBarImpl.java:1108)
            at com.android.internal.widget.ScrollingTabContainerView$TabClickListener.onClick(ScrollingTabContainerView.java:556)
            at android.view.View.performClick(View.java:4478)
            at android.view.View$PerformClick.run(View.java:18698)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:149)
            at android.app.ActivityThread.main(ActivityThread.java:5268)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
            at dalvik.system.NativeStart.main(Native Method)
            Caused by: java.lang.IllegalArgumentException: Binary XML file line #8: Duplicate id 0x7f090093, tag null, or parent id 0x0 with another fragment for com.google.android.gms.maps.SupportMapFragment
            at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2164)
            at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater$WrapperFactory.onCreateView(CalligraphyLayoutInflater.java:249)
            at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:163)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
            at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.inflate(CalligraphyLayoutInflater.java:60)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
            at net.geotune.app.dorukhan.MapFragment.onCreateView(MapFragment.java:177)
            at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
            at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1302)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:729)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
            at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:486)
            at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
            at android.support.v4.view.ViewPager.populate(ViewPager.java:1073)
            at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:555)
            at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:514)
            at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:495)
            at net.geotune.app.main.MainPager.onTabSelected(MainPager.java:95)
            at com.android.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java:578)
            at com.android.internal.app.ActionBarImpl$TabImpl.select(ActionBarImpl.java:1108)
            at com.android.internal.widget.ScrollingTabContainerView$TabClickListener.onClick(ScrollingTabContainerView.java:556)
            at android.view.View.performClick(View.java:4478)
            at android.view.View$PerformClick.run(View.java:18698)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:149)
            at android.app.ActivityThread.main(ActivityThread.java:5268)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
            at dalvik.system.NativeStart.main(Native Method)

我在ViewPager的以下部分中遇到了错误:

@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    viewPager.setCurrentItem(tab.getPosition());
}

最后,build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/ASL2.0'
    }
    defaultConfig {
        applicationId 'net.geotune.app'
        minSdkVersion 19
        targetSdkVersion 19
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    productFlavors {
    }
}

repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'com.google.android.gms:play-services:6.5.87'
    compile 'com.spotify.sdk:spotify-player:1.0.0-beta9@aar'
    compile 'com.spotify.sdk:spotify-auth:1.0.0-beta9@aar'
    compile files('libs/Android/android-async-http-1.3.1.jar')
    compile files('libs/Android/jackson-core-asl-1.8.5.jar')
    compile files('libs/Android/jackson-mapper-asl-1.8.5.jar')
    compile files('libs/Android/KumulosAndroid.0.2.3.jar')
    compile files('libs/spotify-web-api-android-0.1.0.jar')
    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'com.squareup.okhttp:okhttp:2.2.0'
    compile group: 'io.orchestrate', name: 'orchestrate-client', version: '0.9.0'
    compile 'uk.co.chrisjenx:calligraphy:2.0.2'
    compile 'com.sothree.slidinguppanel:library:3.0.0'
}

我知道我上面添加了太多代码,对不起。我只是想不遗余力。

1 个答案:

答案 0 :(得分:0)

gradle和layout文件都没有问题。 MapFragment的onCreateView()应设置如下:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    if (container == null)
        return null;

    if (v != null) {
        ViewGroup parent = (ViewGroup) v.getParent();
        if (parent != null)
            parent.removeView(v);
    }

    try {
        v = inflater.inflate(R.layout.fragment_map, container, false);
    } catch (InflateException e) { }

    mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);

    if (mapFragment != null) {
        mapFragment.onCreate(savedInstanceState);
        mapFragment.onResume();

        try {
            MapsInitializer.initialize(getActivity().getApplicationContext());
        } catch (Exception e) {
            e.printStackTrace();
        }

        googleMap = mapFragment.getMap();
        // Do whatever you want on map here
    }
    return v;    
}

this question中详细讨论了这个问题。因此,我没有详细解释代码段。