2017-03-03 2 views
1

Ich habe eine App erstellt, in der die erste von drei Fragmentregisterkarten eine Karte enthält. Nur die erste Registerkarte ist jetzt implementiert. Sie können ganze App im Repository finden: Fehler beim Hinzufügen der Karte innerhalb der Fragment-Registerkarte

Die App baut normal auf und funktioniert, wenn ich Tabs von 1 bis 3 verschiebe. Der Absturz erscheint, wenn ich zu vorherigen Tabs von Tab 3 versuche eine Laufzeitausnahme:

03-04 20:27:53.809 29056-29056/com.example.lwach.earthquakeapp E/AndroidRuntime: FATAL EXCEPTION: main 
                       Process: com.example.lwach.earthquakeapp, PID: 29056 
                       android.view.InflateException: Binary XML file line #1: Error inflating class fragment 
                        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:770) 
                        at android.view.LayoutInflater.inflate(LayoutInflater.java:483) 
                        at android.view.LayoutInflater.inflate(LayoutInflater.java:415) 
                        at com.example.lwach.earthquakeapp.MapFragment.onCreateView(MapFragment.java:24) 
                        at android.support.v4.app.Fragment.performCreateView(Fragment.java:2189) 
                        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299) 
                        at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528) 
                        at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:752) 
                        at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2355) 
                        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2146) 
                        at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2098) 
                        at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1979) 
                        at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:626) 
                        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.setCurrentItemInternal(ViewPager.java:668) 
                        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:630) 
                        at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:611) 
                        at android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:2178) 
                        at android.support.design.widget.TabLayout.dispatchTabSelected(TabLayout.java:1155) 
                        at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1148) 
                        at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1118) 
                        at android.support.design.widget.TabLayout$Tab.select(TabLayout.java:1413) 
                        at android.support.design.widget.TabLayout$TabView.performClick(TabLayout.java:1523) 
                        at android.view.View$PerformClick.run(View.java:20926) 
                        at android.os.Handler.handleCallback(Handler.java:739) 
                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                        at android.os.Looper.loop(Looper.java:145) 
                        at android.app.ActivityThread.main(ActivityThread.java:5951) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at java.lang.reflect.Method.invoke(Method.java:372) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183) 
                        Caused by: java.lang.IllegalArgumentException: Binary XML file line #1: Duplicate id 0x7f1000c0, tag null, or parent id 0x7f1000bf with another fragment for com.google.android.gms.maps.SupportMapFragment 
                        at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:3420) 
                        at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:47) 
                        at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:178) 
                        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:732) 
                        at android.view.LayoutInflater.inflate(LayoutInflater.java:483)  
                        at android.view.LayoutInflater.inflate(LayoutInflater.java:415)  
                        at com.example.lwach.earthquakeapp.MapFragment.onCreateView(MapFragment.java:24)  
                        at android.support.v4.app.Fragment.performCreateView(Fragment.java:2189)  
                        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299)  
                        at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)  
                        at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:752)  
                        at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2355)  
                        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2146)  
                        at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2098)  
                        at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1979)  
                        at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:626)  
                        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.setCurrentItemInternal(ViewPager.java:668)  
                        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:630)  
                        at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:611)  
                        at android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:2178)  
                        at android.support.design.widget.TabLayout.dispatchTabSelected(TabLayout.java:1155)  
                        at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1148)  
                        at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1118)  
                        at android.support.design.widget.TabLayout$Tab.select(TabLayout.java:1413)  
                        at android.support.design.widget.TabLayout$TabView.performClick(TabLayout.java:1523)  
                        at android.view.View$PerformClick.run(View.java:20926)  
                        at android.os.Handler.handleCallback(Handler.java:739)  
                        at android.os.Handler.dispatchMessage(Handler.java:95)  
                        at android.os.Looper.loop(Looper.java:145)  
                        at android.app.ActivityThread.main(ActivityThread.java:5951)  
                        at java.lang.reflect.Method.invoke(Native Method)  
                        at java.lang.reflect.Method.invoke(Method.java:372)  
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)  
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)  

android.view.InflateException: Binary XML file line #1: Error inflating class fragment com.example.lwach.earthquakeapp.MapFragment.onCreateView 

MainActivity.java

import android.support.design.widget.TabLayout; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.Toolbar; 

public class MainActivity extends AppCompatActivity { 

    private TabLayout tabLayout; 
    private ViewPager viewPager; 
    private Toolbar toolbar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     viewPager = (ViewPager) findViewById(R.id.view_pager); 
     viewPager.setAdapter(new PagerAdapter(this, getSupportFragmentManager())); 

     tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
     tabLayout.setupWithViewPager(viewPager); 

    } 
} 

Hier ist der Adapter für ViewPager

public class PagerAdapter extends FragmentPagerAdapter { 

    private Context context; 

    public PagerAdapter(Context context, FragmentManager fm) { 
     super(fm); 
     this.context = context; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       return new MapFragment(); 
      case 1: 
       return new ListFragment(); 
      case 2: 
       return new GraphFragment(); 
     } 

     return null; 
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     switch(position){ 
      case 0: 
       return context.getString(R.string.action_map); 
      case 1: 
       return context.getString(R.string.action_list); 
      case 2: 
       return context.getString(R.string.action_graph); 
     } 
     return null; 
    } 
} 

MapFragment

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 

public class MapFragment extends Fragment implements OnMapReadyCallback { 

    private GoogleMap mMap; 

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

     View view = inflater.inflate(R.layout.activity_map, container, false); 

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

     return view; 
    } 


    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 

     // Add a marker in Sydney and move the camera 
     LatLng sydney = new LatLng(-34, 151); 
     mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 
    } 
} 
+0

Bitte geben Sie die gesamte stacktrace zeigen. –

+0

Stacktrace hinzugefügt –

+0

bitte kopieren und einfügen. Nicht jeder sieht diese Seite mit einem hochauflösenden Monitor an. –

Antwort

2

Dies ist höchstwahrscheinlich auf eine SupportMapFragment zur Verwendung in einem Fragment verschachtelt, die in einem ViewPager verwendet wird.

Die einfachste Lösung besteht darin, nur das Fragment zu haben, das im ViewPager extend SupportMapFragment direkt verwendet wird. Dies eliminiert die Verwendung verschachtelter Fragmente. Beachten Sie außerdem, dass das Auffüllen eines XML-Layouts bei dieser Lösung nicht erforderlich ist.

Ersetzen Sie Ihre MapFragment mit diesem Code:

public class MapFragment extends SupportMapFragment implements OnMapReadyCallback { 

    private GoogleMap mMap; 

    @Override 
    public void onResume() { 
     super.onResume(); 

     if (mMap == null) { 
      getMapAsync(this); 
     } 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 

     // Add a marker in Sydney and move the camera 
     LatLng sydney = new LatLng(-34, 151); 
     mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 
    } 
} 
+0

Vielen Dank. Es klappt :) –

Verwandte Themen