2016-04-22 57 views
-1

我試圖開發一個載入不同片段的幻燈片菜單的Android應用程序。 一個片段是谷歌地圖。Android工作室:集成谷歌地圖作爲片段:錯誤膨脹類片段

當應用程序啓動時,地圖片段加載良好。 但是,當我swich片段使用slidemenu並回到地圖片段,應用程序崩潰。

有什麼想法?非常感謝

我在logcat的這條消息錯誤:

04-22 16:26:12.354 10759-10759/me.eazypark.eazypark E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: me.eazypark.eazypark, PID: 10759 
                    android.view.InflateException: Binary XML file line #6: Error inflating class fragment 
                     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:720) 
                     at android.view.LayoutInflater.rInflate(LayoutInflater.java:762) 
                     at android.view.LayoutInflater.inflate(LayoutInflater.java:499) 
                     at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
                     at me.eazypark.eazypark.fragment.Fragment1.onCreateView(Fragment1.java:19) 
                     at android.app.Fragment.performCreateView(Fragment.java:1700) 
                     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890) 
                     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 
                     at android.app.BackStackRecord.run(BackStackRecord.java:684) 
                     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) 
                     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) 
                     at android.os.Handler.handleCallback(Handler.java:733) 
                     at android.os.Handler.dispatchMessage(Handler.java:95) 
                     at android.os.Looper.loop(Looper.java:136) 
                     at android.app.ActivityThread.main(ActivityThread.java:5426) 
                     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:1268) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
                     at dalvik.system.NativeStart.main(Native Method) 
                    Caused by: java.lang.IllegalArgumentException: Binary XML file line #6: Duplicate id 0x7f0c007d, 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:2293) 
                     at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:120) 
                     at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:357) 
                     at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31) 
                     at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:80) 
                     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696) 
                     at android.view.LayoutInflater.rInflate(LayoutInflater.java:762)  
                     at android.view.LayoutInflater.inflate(LayoutInflater.java:499)  
                     at android.view.LayoutInflater.inflate(LayoutInflater.java:398)  
                     at me.eazypark.eazypark.fragment.Fragment1.onCreateView(Fragment1.java:19)  
                     at android.app.Fragment.performCreateView(Fragment.java:1700)  
                     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)  
                     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)  
                     at android.app.BackStackRecord.run(BackStackRecord.java:684)  
                     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)  
                     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)  
                     at android.os.Handler.handleCallback(Handler.java:733)  
                     at android.os.Handler.dispatchMessage(Handler.java:95)  
                     at android.os.Looper.loop(Looper.java:136)  
                     at android.app.ActivityThread.main(ActivityThread.java:5426)  
                     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:1268)  
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)  
                     at dalvik.system.NativeStart.main(Native Method)  

這裏是我的文件:

-Manifest:

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

<uses-permission android:name="com.myapp.android.locationapi.maps.permission.MAPS_RECEIVE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 


<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".LoginActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".SubscribeActivity" > 
    </activity> 
    <activity android:name=".ProfileActivity" > 
    </activity> 

    <meta-data 
     android:name="com.google.android.maps.v2.API_KEY" 
     android:value="@string/google_app_id" /> 
</application> 

-ProfilActivity(包含菜單並且必須顯示差異ferents片段):

import android.app.Fragment; 
import android.app.FragmentManager; 
import android.app.FragmentTransaction; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.os.Bundle; 

import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.app.AlertDialog; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.content.SharedPreferences; 
import android.content.Intent; 



import me.eazypark.eazypark.fragment.Fragment1; 
import me.eazypark.eazypark.fragment.Fragment2; 
import me.eazypark.eazypark.fragment.Fragment3; 

import java.util.ArrayList; 
import java.util.List; 



public class ProfileActivity extends AppCompatActivity{ 

private List<ItemSlideMenu> listSliding; 
private SlidingMenuAdapter adapter; 
private ListView listViewSliding; 
private DrawerLayout drawerLayout; 
private ActionBarDrawerToggle actionBarDrawerToggle; 

public static android.support.v4.app.FragmentManager fragmentManager; 


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

    //Init component 
    listViewSliding = (ListView) findViewById(R.id.lv_sliding_menu); 
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    listSliding = new ArrayList<>(); 

    fragmentManager = getSupportFragmentManager(); 

    //Add item for sliding list 
    listSliding.add(new ItemSlideMenu(R.drawable.ic_action_map, "Map")); 
    listSliding.add(new ItemSlideMenu(R.drawable.ic_action_account, "Account")); 
    listSliding.add(new ItemSlideMenu(R.drawable.ic_action_logout, "Logout")); 
    adapter = new SlidingMenuAdapter(this, listSliding); 
    listViewSliding.setAdapter(adapter); 

    //Display icon to open/ close sliding list 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    //Set title 
    setTitle(listSliding.get(0).getTitle()); 
    //item selected 
    listViewSliding.setItemChecked(0, true); 
    //Close menu 
    drawerLayout.closeDrawer(listViewSliding); 

    //Display fragment 1 when start 
    replaceFragment(0); 

    //Fetching email from shared preferences 
    SharedPreferences sharedPreferences = getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE); 
    String email = sharedPreferences.getString(Config.EMAIL_SHARED_PREF,"Not Available"); 

    //Hanlde on item click 
    listViewSliding.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      //Set title 
      setTitle(listSliding.get(position).getTitle()); 
      //item selected 
      listViewSliding.setItemChecked(position, true); 
      //Replace fragment 
      replaceFragment(position); 
      //Close menu 
      drawerLayout.closeDrawer(listViewSliding); 
     } 
    }); 

    actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_opened, R.string.drawer_closed){ 

     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      invalidateOptionsMenu(); 
     } 

     @Override 
     public void onDrawerClosed(View drawerView) { 
      super.onDrawerClosed(drawerView); 
      invalidateOptionsMenu(); 
     } 
    }; 

    drawerLayout.setDrawerListener(actionBarDrawerToggle); 
} 


//Logout function 
private void logout(){ 
    //Creating an alert dialog to confirm logout 
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
    alertDialogBuilder.setMessage("Are you sure you want to logout?"); 
    alertDialogBuilder.setPositiveButton("Yes", 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface arg0, int arg1) { 

        //Getting out sharedpreferences 
        SharedPreferences preferences = getSharedPreferences(Config.SHARED_PREF_NAME,Context.MODE_PRIVATE); 
        //Getting editor 
        SharedPreferences.Editor editor = preferences.edit(); 

        //Puting the value false for loggedin 
        editor.putBoolean(Config.LOGGEDIN_SHARED_PREF, false); 

        //Putting blank value to email 
        editor.putString(Config.EMAIL_SHARED_PREF, ""); 

        //Saving the sharedpreferences 
        editor.commit(); 

        //Starting login activity 
        Intent intent = new Intent(ProfileActivity.this, LoginActivity.class); 
        startActivity(intent); 
       } 
      }); 

    alertDialogBuilder.setNegativeButton("No", 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface arg0, int arg1) { 

       } 
      }); 

    //Showing the alert dialog 
    AlertDialog alertDialog = alertDialogBuilder.create(); 
    alertDialog.show(); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    /*button logout*/ 
    if(actionBarDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    /*button slide menu*/ 
    int id = item.getItemId(); 
    if (id == R.id.menuLogout) { 
     //calling logout method when the logout button is clicked 
     logout(); 
    } 
    return super.onOptionsItemSelected(item); 
} 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    actionBarDrawerToggle.syncState(); 
} 

//Create method replace fragment 
private void replaceFragment(int pos) { 
    Fragment fragment = null; 
    switch (pos) { 
     case 0: 
      fragment = new Fragment1(); 
      break; 
     case 1: 
      fragment = new Fragment2(); 
      break; 
     case 2: 
      fragment = new Fragment3(); 
      break; 
     default: 
      fragment = new Fragment1(); 
      break; 
    } 

    if(null!=fragment) { 
     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction transaction =   fragmentManager.beginTransaction(); 
     transaction.replace(R.id.main_content, fragment); 
     transaction.addToBackStack(null); 
     transaction.commit(); 
    } 
} 



} 

-Fragment1(地圖片段):

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

import me.eazypark.eazypark.R; 

public class Fragment1 extends Fragment { 
public Fragment1() { 
} 

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

-fragment1.xml(片段1佈局):

<?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" > 

<fragment 
    android:id="@+id/location_map" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    class="com.google.android.gms.maps.SupportMapFragment" /> 

</RelativeLayout> 

-LocationFragment(地圖類):

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

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
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 LocationFragment extends Fragment { 

private static View view; 
/** 
* Note that this may be null if the Google Play services APK is not 
* available. 
*/ 

private static GoogleMap mMap; 
private static Double latitude, longitude; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    if (container == null) { 
     return null; 
    } 
    view = (RelativeLayout) inflater.inflate(R.layout.fragment1, container, false); 
    // Passing harcoded values for latitude & longitude. Please change as per your need. This is just used to drop a Marker on the Map 
    latitude = 48.85; 
    longitude = 2.35; 

    setUpMapIfNeeded(); // For setting up the MapFragment 

    return view; 
} 

/***** Sets up the map if it is possible to do so *****/ 
public static void setUpMapIfNeeded() { 
    // Do a null check to confirm that we have not already instantiated the map. 
    if (mMap == null) { 
     // Try to obtain the map from the SupportMapFragment. 
     mMap = ((SupportMapFragment) ProfileActivity.fragmentManager 
       .findFragmentById(R.id.location_map)).getMap(); 
     // Check if we were successful in obtaining the map. 
     if (mMap != null) 
      setUpMap(); 
    } 
} 

/** 
* This is where we can add markers or lines, add listeners or move the 
* camera. 
* <p> 
* This should only be called once and when we are sure that {@link #mMap} 
* is not null. 
*/ 
private static void setUpMap() { 
    // For showing a move to my loction button 
    //mMap.setMyLocationEnabled(true); 
    // For dropping a marker at a point on the Map 
    mMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("My Home").snippet("Home Address")); 
    // For zooming automatically to the Dropped PIN Location 
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, 
      longitude), 12.0f)); 
} 


@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    if (mMap != null) 
     setUpMap(); 

    if (mMap == null) { 
     // Try to obtain the map from the SupportMapFragment. 
     mMap = ((SupportMapFragment) ProfileActivity.fragmentManager 
       .findFragmentById(R.id.location_map)).getMap(); // getMap is deprecated 
     // Check if we were successful in obtaining the map. 
     if (mMap != null) 
      setUpMap(); 
    } 
} 

/**** The mapfragment's id must be removed from the FragmentManager 
**** or else if the same it is passed on the next time then 
**** app will crash ****/ 
@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    if (mMap != null) { 
     ProfileActivity.fragmentManager.beginTransaction() 
       .remove(ProfileActivity.fragmentManager.findFragmentById(R.id.location_map)).commit(); 
     mMap = null; 
    } 
} 
} 
+1

試着讓人們的生活更容易幫助你。即:更少的代碼(但一些)和更全面的解釋你的問題。這只是一個建議。 –

+1

我說英語很不好對不起。我試圖全面瞭解我的問題,但是更多地說了些什麼?應用程序在特定情況下崩潰+錯誤日誌消息+文件代碼。還有什麼 ? –

+1

我的英語也是垃圾,但它不是語言的問題,它是關於展示你試圖解決你自己的問題的努力,並使它對那些將要幫助你的人更加孤立,參見:http:// 「stackoverflow.com/help/how-to-ask」搜索和研究「 –

回答

2
private GoogleMap googleMap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 
      SetupActionBar(); 

      try { 
       setContentView(R.layout.activity_near_by_deals_details); 
       try { 

        context = this; 
        if (googleMap == null) { 
         googleMap = ((MapFragment) getFragmentManager() 
           .findFragmentById(R.id.map)).getMap(); 
        } 
        DrawPoint(pass param if needed); 
     } 


    public void DrawPoint(String param) { 
      googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
      MarkerOptions marker = new MarkerOptions().position(new LatLng(LAT, LON)).title(name); 
      marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE)); 
      googleMap.addMarker(marker); 

      CameraPosition cameraPosition = new CameraPosition.Builder().target(
        new LatLng(LAT, LON)).zoom(15).build(); 

      googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 
      googleMap.getUiSettings().setZoomControlsEnabled(true); 
      googleMap.getUiSettings().setZoomGesturesEnabled(true); 
     } 

和XML文件:

<LinearLayout 
      android:id="@+id/lnr_deal_detaisl_maps" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:orientation="vertical"> 


      <fragment 
       android:id="@+id/map" 
       android:name="com.google.android.gms.maps.MapFragment" 
       android:layout_width="fill_parent" 
       android:layout_height="300dp" 
       android:layout_marginTop="20dp" 
       android:layout_weight="0.92" /> 


    </LinearLayout> 

上面的代碼對我的作品完美。你有沒有檢查你的清單? Google API密鑰有效嗎?

相關問題