2016-04-22 4 views
-1

Ich versuche, eine Android-App mit einem Folienmenü zu entwickeln, die verschiedene Fragmente lädt. Ein Fragment ist eine Google-Karte.Android Studio: googlemap als Fragment integrieren: Fehler beim Aufblasen des Klassenfragments

Wenn die Anwendung gestartet wird, wird das Kartenfragment gut geladen. Aber wenn ich Fragment mit Slidemenu switch und zurück zum Kartenfragment komme, stürzt die Anwendung ab.

Irgendeine Idee? Vielen Dank

bekam ich diese Fehlermeldung in 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)  

Hier ist meine Dateien:

-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 (enthält das Menü und muss die Diff anzeigen ferents Fragmente):

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 (map-Fragment):

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 (Fragment 1-Layout):

<?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 (map-Klasse):

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

Versuchen Sie, das Leben der Menschen, die Ihnen helfen sollen, zu erleichtern. d. h. weniger Code (aber einige) und eine umfassendere Erläuterung Ihres Problems. Dies ist nur ein Ratschlag. –

+1

Ich spreche sehr schlecht Englisch Entschuldigung. Ich habe versucht, umfassend zu meinem Problem zu sein, aber was hat mehr gesagt? App-Absturz in einer bestimmten Situation + Fehlerprotokollnachricht + Dateicode. Was sonst ? –

+1

Mein Englisch ist auch Müll, aber es ist nicht eine Frage der Sprache, es ist eine Bemühung von Ihnen zu zeigen versuchen, das Problem zu lösen Ihre eigenen und es isolierter für die Menschen, die Ihnen helfen wird, zu sehen: http: // stackoverflow.com/help/how-to-ask "Suchen und Recherchieren" –

Antwort

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); 
     } 

Und die XML-Datei:

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

Above Codes perfekt funktioniert für mich. Hast du dein Manifest überprüft? Google API-Schlüssel funktioniert?

Verwandte Themen