我正在尝试在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'
}
我知道我上面添加了太多代码,对不起。我只是想不遗余力。
答案 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中详细讨论了这个问题。因此,我没有详细解释代码段。