谷歌地图MapFragment导致应用程序崩溃

问题描述:

我对android编程相当新,但我试图做的似乎相当简单,但。我在这个设置中使用了4个不同的标签,第一个应该显示一个Fragment和谷歌地图API以及其他一些我还没有做过的东西。在网上一些教程之后,我设法获得了我想要的选项卡的功能并让地图出现。谷歌地图MapFragment导致应用程序崩溃

从初始选项卡更改为其他地图(选项卡1)时,该应用工作正常,但尝试返回时崩溃。奇怪的是,当地图片段位于其中一个选项卡中时,它会使第二个选项卡在某些转场时崩溃,在下图中显示为蓝色箭头的转场效果良好,而具有黄色箭头的转场会使应用崩溃。

http://imageshack.com/a/img839/4796/kf7w.png

如果我更改其他所有的再次转变做工精细的一个第一片片段,所以我觉得这个问题确实必须与地图片段。

我的代码如下:

MainActivity.java

public class MainActivity extends FragmentActivity implements ActionBar.TabListener { 
private ViewPager viewPager; 
private TabsPagerAdapter mAdapter; 
private ActionBar actionBar; 
private String[] tabs = null; 

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

    viewPager = (ViewPager) findViewById(R.id.pager); 
    actionBar = getActionBar(); 
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); 

    viewPager.setAdapter(mAdapter); 
    actionBar.setHomeButtonEnabled(false); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    tabs = getResources().getStringArray(R.array.tab_names); 
    for (String tab_name : tabs) 
     actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this)); 

    /** 
    * on swiping the viewpager make respective tab selected 
    * */ 
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     @Override 
     public void onPageSelected(int position) { 
      // on changing the page 
      // make respected tab selected 
      actionBar.setSelectedNavigationItem(position); 
     } 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 
     } 
    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    // TODO Auto-generated method stub 

} 

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

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    // TODO Auto-generated method stub 

} 

} 

TabsPagerAdapter.java

public class TabsPagerAdapter extends FragmentPagerAdapter { 

public TabsPagerAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int index) { 
    switch (index){ 
    case 0: 
     return new GoogleMapsFragment(); 
    case 1: 
     return new SampleFragment(); 
    case 2: 
     return new ContactFragment(); 
    case 3: 
     return new WhoFragment(); 
    default: 
     Log.e("switch", "default"); 
    } 
    return null; 
} 

@Override 
public int getCount() { 
    // get item count - equal to number of tabs 
    return 4; 
} 

} 

GoogleMapsFragment.java

public class GoogleMapsFragment extends Fragment { 

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

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

    return rootView; 
} 

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    Fragment f = (Fragment) getFragmentManager().findFragmentById(R.id.map);   
    if (f != null) { 
     getFragmentManager().beginTransaction().remove(f).commit(); 
    } 
} 
} 

和XML文件:

activity_main.xml中

<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=".MainActivity" 

android:background="#ffff0000" 
android:id="@+id/mainLayout" 
android:tag="@+id/mainLayoutTag" > 

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:tag="pagerTag"> 
</android.support.v4.view.ViewPager> 

</RelativeLayout> 

activity_map.xml

<?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" 
android:id="@+id/mapLayout" 
android:tag="mapLayoutTag" > 

<fragment android:id="@+id/map" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:name="com.google.android.gms.maps.MapFragment" 
     android:tag="gMaps"/> 


</RelativeLayout> 

的其他Java类是几乎空的,其他的XML文件只包含默认RelativeLayout的。

有什么建议我能做些什么来解决这个问题? 感谢您的时间阅读所有:)

编辑: 忘了崩溃的错误:

02-10 23:42:01.723: E/AndroidRuntime(7221): Caused by: 
java.lang.IllegalArgumentException: Binary XML file line #9: 
Duplicate id 0x7f05000a, tag gMaps, or parent id 0x7f050009 with another 
fragment for com.google.android.gms.maps.MapFragment 
+0

您是否找到解决此问题的解决方案。我也在奋斗。 – Parthi

好管理仅通过切换在onDestroy()功能超级调用的位置来解决这个。似乎我需要首先销毁或取消分配其父母的片段才能使其工作。继承人的新onDestroy()代码,如果有人仍然有同样的问题:

@Override 
public void onDestroyView() { 
    userMarker.remove(); 

    Fragment f = (Fragment) getFragmentManager().findFragmentById(R.id.map);   
    if (f != null) { 
     getFragmentManager().beginTransaction().remove(f).commit(); 
    } 

    super.onDestroyView();   
} 
+0

我不知道userMarker是什么,但是我把它遗忘了,它对我很好!谢谢! – lisa

后搜索的负荷,终于让我找到这个教程:Using an Android MapView inside of a Fragment 和它的作品真棒!希望它可以帮助你的家伙!