【问题标题】:Android app crash when come back to fragmentmap - GoogleMap v2返回片段地图时Android应用程序崩溃 - Google Map v2
【发布时间】:2014-05-24 00:12:59
【问题描述】:

在我的应用程序中,我有一个 SherlockNavigationDrawer,带有一个选项列表,每个选项都有一个不同的活动,它使用片段图调用 xml,当我打开地图并想打开另一个地图时,我没有问题,但我得到了当我返回任何已经打开的地图时。

这是我的代码,欢迎提出任何建议:

MainActivity.java:

public class MainActivity extends SherlockFragmentActivity {

// Declare Variables
DrawerLayout mDrawerLayout;
ListView mDrawerList;
ActionBarDrawerToggle mDrawerToggle;
MenuListAdapter mMenuAdapter;
String[] title;
Fragment fragment1 = new Fragment1();
Fragment fragment2 = new Fragment2();
Fragment fragment3 = new Fragment3();
private CharSequence mDrawerTitle;
private CharSequence mTitle;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Get the view from drawer_main.xml
    setContentView(R.layout.drawer_main);

    // Get the Title
    mTitle = mDrawerTitle = "¿Qué buscás?";

    // Generate title
    title = new String[] { "CORTE LÁSER", "CORTE METALES",
            "CORTE POR CHORRO DE AGUA", "CURSOS", "EQUIPOS DE VIDEO", "FICHAS  TÉCNICAS", 
            "FOTÓGRAFOS", "GRÁFICAS", "IMPRESIÓN 3D", "LIBRERÍAS Y PAPELERAS", "MAQUETAS Y PROTOTIPOS",
            "MODELADO 3D", "MODELOS", "PLÁSTICOS", "ROUTER", "SUBLIMACIÓN", "TELGOPOR", "TERMOFORMADO",
            "TORNERO MADERA", "TORNERO METALES", "VINILOS" };

    // Locate DrawerLayout in drawer_main.xml
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    // Locate ListView in drawer_main.xml
    mDrawerList = (ListView) findViewById(R.id.listview_drawer);

    // Set a custom shadow that overlays the main content when the drawer
    // opens
    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
            GravityCompat.START);

    // Pass string arrays to MenuListAdapter
    mMenuAdapter = new MenuListAdapter(MainActivity.this, title);

    // Set the MenuListAdapter to the ListView
    mDrawerList.setAdapter(mMenuAdapter);

    // Capture listview menu item click
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

    // Enable ActionBar app icon to behave as action to toggle nav drawer
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    // ActionBarDrawerToggle ties together the the proper interactions
    // between the sliding drawer and the action bar app icon
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.ic_drawer, R.string.drawer_open,
            R.string.drawer_close) {

        public void onDrawerClosed(View view) {
            // TODO Auto-generated method stub
            super.onDrawerClosed(view);
        }

        public void onDrawerOpened(View drawerView) {
            // TODO Auto-generated method stub
            // Set the title on the action when drawer open
            getSupportActionBar().setTitle(mDrawerTitle);
            super.onDrawerOpened(drawerView);
        }
    };

    mDrawerLayout.setDrawerListener(mDrawerToggle);

    if (savedInstanceState == null) {
        selectItem(0);
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if (item.getItemId() == android.R.id.home) {

        if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            mDrawerLayout.openDrawer(mDrawerList);
        }
    }

    return super.onOptionsItemSelected(item);
}

// ListView click listener in the navigation drawer
private class DrawerItemClickListener implements
        ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        selectItem(position);
    }
}

private void selectItem(int position) {

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    // Locate Position
    switch (position) {
    case 0:
        
        ft.replace(R.id.content_frame, fragment1);

        break;
    case 1:
        
        ft.replace(R.id.content_frame, fragment2);

        break;
    case 2:
        
        ft.replace(R.id.content_frame, fragment3);

        break;
    }
    
    ft.commit();
    mDrawerList.setItemChecked(position, true);
    // Get the title followed by the position
    setTitle(title[position]);
    // Close drawer
    mDrawerLayout.closeDrawer(mDrawerList);
    
}


@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Pass any configuration change to the drawer toggles
    mDrawerToggle.onConfigurationChanged(newConfig);
}

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    getSupportActionBar().setTitle(mTitle);
}}

Fragment3.java:

public class Fragment3 extends SherlockFragment {
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle   savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment3, container, false);
    return rootView;
}

@Override
public void onViewCreated(View v, Bundle savedInstanceState){
    super.onViewCreated(v, savedInstanceState);
    
final LatLng Initial = new LatLng(-34.673009, -58.474111);
final LatLng FADU = new LatLng(-34.542163, -58.443716);
final LatLng UNO = new LatLng(-34.524924, -58.576421);
final LatLng DOS = new LatLng(-34.755415, -58.577794);
final LatLng TRES = new LatLng(-34.787001, -58.461751);
GoogleMap googlemap;

    googlemap  = ((SupportMapFragment)  getFragmentManager().findFragmentById(R.id.map3)).getMap();

    googlemap.setMyLocationEnabled(true);
    googlemap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    CameraUpdate update = CameraUpdateFactory.newLatLngZoom(Initial, 10);
    googlemap.animateCamera(update);
    
    
    googlemap.addMarker(new  MarkerOptions().position(FADU).title("FADU").snippet("Facultad de Arquitectura, Diseño y  Urbanismo")
    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));
    
    googlemap.addMarker(new MarkerOptions().position(UNO).title("XXX").snippet("UNO"));
    googlemap.addMarker(new MarkerOptions().position(DOS).title("XXX").snippet("DOS"));
    googlemap.addMarker(new  MarkerOptions().position(TRES).title("XXXX").snippet("TRES"));
    
}}

fragment3.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" >  <fragment
    android:id="@+id/map3"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.SupportMapFragment"/>

如你所见,我在抽屉列表中有 21 个选项都有地图,它们都有活动和相应的 xml,除了标记之外唯一改变的是 id 地图

AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="19" />

<permission
   
<uses-permission  android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

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

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Sherlock.Light" >
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    <meta-data
       

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:label="@string/app_name"   android:name=".Fragment2" android:process=":processmap2">
    </activity>
    <activity android:label="@string/app_name"   android:name=".Fragment3" android:process=":processmap3">
    </activity></application></manifest>

我有一个活动进程,当我打开地图并想打开另一个时可能会产生错误,问题就在这里,应该做的是在我打开一个新地图时终止地图上方的进程

那是德 LogCat:

05-23 21:54:06.906: D/AndroidRuntime(3342): 关闭虚拟机

05-23 21:54:06.906: W/dalvikvm(3342): threadid=1: 线程以未捕获的异常退出 (group=0x40015578)

05-23 21:54:06.937:E/AndroidRuntime(3342):致命异常:主要

05-23 21:54:06.937: E/AndroidRuntime(3342): android.view.InflateException: Binary XML file line #6: Error inflating class fragment

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:587)

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:623)

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.view.LayoutInflater.inflate(LayoutInflater.java:408)

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.view.LayoutInflater.inflate(LayoutInflater.java:320)

05-23 21:54:06.937: E/AndroidRuntime(3342): at com.TheX.fadubusca.Fragment2.onCreateView(Fragment2.java:22)

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.os.Handler.handleCallback(Handler.java:587)

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.os.Handler.dispatchMessage(Handler.java:92)

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.os.Looper.loop(Looper.java:130)

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.app.ActivityThread.main(ActivityThread.java:3687)

05-23 21:54:06.937: E/AndroidRuntime(3342): at java.lang.reflect.Method.invokeNative(Native Method)

05-23 21:54:06.937: E/AndroidRuntime(3342): at java.lang.reflect.Method.invoke(Method.java:507)

05-23 21:54:06.937: E/AndroidRuntime(3342): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)

05-23 21:54:06.937: E/AndroidRuntime(3342): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)

05-23 21:54:06.937: E/AndroidRuntime(3342): at dalvik.system.NativeStart.main(Native Method)

05-23 21:54:06.937: E/AndroidRuntime(3342): Caused by: java.lang.IllegalArgumentException: Binary XML file line #6: Duplicate id 0x7f05002a, tag null, or parent id 0x0 with another fragment for com.google.android.gms.maps.SupportMapFragment

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:296)

05-23 21:54:06.937: E/AndroidRuntime(3342): 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)

05-23 21:54:06.937: E/AndroidRuntime(3342): ... 19 更多

对不起,如果我发错了,我是第一次来这里,也是为了我的英语,我注意到我是初学者编码

编辑: 我想我通过在每个片段活动的末尾添加这个解决了这个问题:

    @Override
public void onPause() {
    super.onPause();
    
 }
@Override
public void onDestroyView() {

    super.onDestroyView(); 
    Fragment fragment = (getFragmentManager().findFragmentById(R.id.map3));  
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
    ft.remove(fragment);
    ft.commit();        
}

现在我可以毫无问题地在片段之间切换

【问题讨论】:

    标签: java android eclipse google-maps


    【解决方案1】:

    该错误是因为您已经在 FragmentManager 中添加了片段,您不能将相同的片段添加两次。您需要实施 FragmentTransaction.replace 而不是 FragmentTransaction.add

        case 0:
            ft.replace(R.id.content_frame, fragment1);
            //ft.addToBackStack(null); this maybe is not necesary.
            break;
        case 1:
            ft.replace(R.id.content_frame, fragment2);
            break;
        case 2:
            ft.replace(R.id.content_frame, fragment3);
            break;
        }
    

    【讨论】:

    • 感谢您的快速响应,我通过替换修改了transaction.add,并删除了backstack,但仍然崩溃。现在编辑 LogCat 以查看我第二次打开任何片段时的问题
    【解决方案2】:

    这在原始海报编辑的背面对我有用。使用“getFragmentManager()”而不是“getSupportFragmentManager()”。

    @Override
        public void onResume() {
            super.onResume();
            try {
                // Loading map
                initializeMap();
    
             } catch (Exception e) {
                 e.printStackTrace();
            }
        }
    
        @Override
        public void onDestroyView() {
    
            super.onDestroyView();
            Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));
            FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
            ft.remove(fragment);
            ft.commit();
        }
    

    【讨论】:

      猜你喜欢
      • 2016-07-21
      • 2013-10-04
      • 2016-06-20
      • 2013-03-07
      • 2013-10-03
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多