使用TabLayout在ViewPager中的Google地图片段中夸大异常

Moe*_*eez 8 android google-maps inflate-exception google-maps-android-api-2 android-tablayout

我制作了一个应用程序,其中我在我的位置显示了带有GPS位置标记的Google地图.此地图位于第一个选项卡上,我还有另外两个选项卡,如下图所示

在此输入图像描述

现在我面临一个问题,即当我从选项卡1移动到选项卡2然后再转到选项卡1时它完美地工作,但是当我移动到选项卡3然后移回选项卡1或选项卡2时,应用程序崩溃并给出以下内容例外情况LogCat:

01-27 18:35:26.190 9414-9414/com.example.accurat.faisal E/AndroidRuntime: FATAL EXCEPTION: main
  Process: com.example.accurat.faisal, PID: 9414
  android.view.InflateException: Binary XML file line #26: Binary XML file line #26: Error inflating class fragment
      at android.view.LayoutInflater.inflate(LayoutInflater.java:551)
      at android.view.LayoutInflater.inflate(LayoutInflater.java:429)
      at com.example.accurat.faisal.MyLocation.onCreateView(MyLocation.java:62)
      at android.support.v4.app.Fragment.performCreateView(Fragment.java:2184)
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1298)
      at android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323)
      at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2136)
      at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092)
      at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1969)
      at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:620)
      at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
      at android.support.v4.view.ViewPager.populate(ViewPager.java:1268)
      at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
      at android.support.v4.view.ViewPager$3.run(ViewPager.java:273)
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
      at android.view.Choreographer.doCallbacks(Choreographer.java:686)
      at android.view.Choreographer.doFrame(Choreographer.java:619)
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
      at android.os.Handler.handleCallback(Handler.java:739)
      at android.os.Handler.dispatchMessage(Handler.java:95)
      at android.os.Looper.loop(Looper.java:148)
      at android.app.ActivityThread.main(ActivityThread.java:7325)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
   Caused by: android.view.InflateException: Binary XML file line #26: Error inflating class fragment
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:794)
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)
      at android.view.LayoutInflater.rInflate(LayoutInflater.java:847)
      at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
      at android.view.LayoutInflater.inflate(LayoutInflater.java:527)
      at android.view.LayoutInflater.inflate(LayoutInflater.java:429) 
      at com.example.accurat.faisal.MyLocation.onCreateView(MyLocation.java:62) 
      at android.support.v4.app.Fragment.performCreateView(Fragment.java:2184) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1298) 
      at android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323) 
      at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2136) 
      at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092) 
      at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1969) 
      at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:620) 
      at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:1268) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:1116) 
      at android.support.v4.view.ViewPager$3.run(ViewPager.java:273) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:686) 
      at android.view.Choreographer.doFrame(Choreographer.java:619) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:148) 
      at android.app.ActivityThread.main(ActivityThread.java:7325) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
   Caused by: java.lang.IllegalArgumentException: Binary XML file line #26: Duplicate id 0x7f10010d, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.maps.SupportMapFragment
      at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:3364)
      at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:47)
      at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:192)
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:758)
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716) 
      at android.view.LayoutInflater.rInflate(LayoutInflater.java:847) 
      at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:527) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:429) 
      at com.example.accurat.faisal.MyLocation.onCreateView(MyLocation.java:62) 
      at android.support.v4.app.Fragment.performCreateView(Fragment.java:2184) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1298) 
      at android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323) 
      at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2136) 
      at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092) 
      at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1969) 
      at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:620) 
      at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:1268) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:1116) 
      at android.support.v4.view.ViewPager$3.run(ViewPager.java:273) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:686) 
      at android.view.Choreographer.doFrame(Choreographer.java:619) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:148) 
      at android.app.ActivityThread.main(ActivityThread.java:7325) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at 
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Run Code Online (Sandbox Code Playgroud)

它在下面显示错误:

// inflat and return the layout
    View rootView = inflater.inflate(R.layout.my_location, container, false);
Run Code Online (Sandbox Code Playgroud)

无论我选择任何标签,它总是在上面一行显示错误,即当我转到我的pictures标签并返回到cameramy location标签时,它总是向我显示上述行的错误.

下面是我的布局

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.accurat.faisal">

<permission android:name="com.example.accurat.faisal.permission.MAPS_RECEIVE"
    android:protectionLevel="signature"/>

<uses-permission android:name="com.example.accurat.faisal.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true"
    />


<application
    android:name=""
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="MY_KEY"
        />

    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
Run Code Online (Sandbox Code Playgroud)

下面是我的布局代码

<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.accurat.faisal.MyLocation$PlaceholderFragment">

<TextView
    android:id="@+id/section_label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/section_label"
    android:id="@+id/textView"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:textAppearance="@style/TextAppearance.AppCompat.Body2" />

<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"
    tools:context="com.example.app.MyLocation"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_below="@+id/section_label" />
Run Code Online (Sandbox Code Playgroud)

我已搜查,发现了很多答案,他们(1,2,3),但也没能找到它的任何帮助

我坚持,任何帮助将不胜感激

Cha*_*ruක 11

注意:当布局包含<fragment>时,您无法将布局扩展为片段.

仅在动态添加到片段时才支持嵌套片段.

这将解决您的问题,但请注意可能有更好的问题,

  • 在地图片段中保留静态视图
  • onCreateView检查中视图为空,第一次它将为null
  • 如果有一个视图(在第一次加载之后)你需要删除它,所以每当片段被调用时它就像第一次一样
  • 然后,您可以将视图(my_location)设置为片段,这样您就不会遇到嵌套片段问题

例:

 private static View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (view != null) {
            ViewGroup viewGroupParent = (ViewGroup) view.getParent();
            if (viewGroupParent != null)
                viewGroupParent.removeView(view);
        }
        try {
            view = inflater.inflate(R.layout.yourLayoutWithMap, container, false);
        } catch (Exception e) {
            // map is already there
        }
        return view;
    }
Run Code Online (Sandbox Code Playgroud)

在这里找到有趣的答案