dupliziert id mit fragment
Ich versuche zu erfolgen drawernavigation (meine erste fragment ist eine map & die anderen sind nur einige Fragmente mit einfachen layouts).Also es läuft wunderbar & ich kann navigieren zwischen meine Fragmente, aber wenn ich zurück an das erste fragment, das ist eine Karte bekam ich einen crash -
logcat:
11-20 11:03:27.306: E/AndroidRuntime(13787): FATAL EXCEPTION: main
11-20 11:03:27.306: E/AndroidRuntime(13787): android.view.InflateException: Binary XML file line #6: Error inflating class fragment
11-20 11:03:27.306: E/AndroidRuntime(13787): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697)
11-20 11:03:27.306: E/AndroidRuntime(13787): at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
11-20 11:03:27.306: E/AndroidRuntime(13787): at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
11-20 11:03:27.306: E/AndroidRuntime(13787): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
11-20 11:03:27.306: E/AndroidRuntime(13787): at challenge.arabe.taxitaxi.HomeFragment.onCreateView(HomeFragment.java:48)
11-20 11:03:27.306: E/AndroidRuntime(13787): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:828)
11-20 11:03:27.306: E/AndroidRuntime(13787): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1032)
11-20 11:03:27.306: E/AndroidRuntime(13787): at android.app.BackStackRecord.run(BackStackRecord.java:622)
11-20 11:03:27.306: E/AndroidRuntime(13787): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1382)
11-20 11:03:27.306: E/AndroidRuntime(13787): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426)
11-20 11:03:27.306: E/AndroidRuntime(13787): at android.os.Handler.handleCallback(Handler.java:605)
11-20 11:03:27.306: E/AndroidRuntime(13787): at android.os.Handler.dispatchMessage(Handler.java:92)
11-20 11:03:27.306: E/AndroidRuntime(13787): at android.os.Looper.loop(Looper.java:137)
11-20 11:03:27.306: E/AndroidRuntime(13787): at android.app.ActivityThread.main(ActivityThread.java:4511)
11-20 11:03:27.306: E/AndroidRuntime(13787): at java.lang.reflect.Method.invokeNative(Native Method)
11-20 11:03:27.306: E/AndroidRuntime(13787): at java.lang.reflect.Method.invoke(Method.java:511)
11-20 11:03:27.306: E/AndroidRuntime(13787): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
11-20 11:03:27.306: E/AndroidRuntime(13787): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
11-20 11:03:27.306: E/AndroidRuntime(13787): at dalvik.system.NativeStart.main(Native Method)
11-20 11:03:27.306: E/AndroidRuntime(13787): Caused by: java.lang.IllegalArgumentException: Binary XML file line #6: Duplicate id 0x7f05000c, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.maps.MapFragment
11-20 11:03:27.306: E/AndroidRuntime(13787): at android.app.Activity.onCreateView(Activity.java:4253)
11-20 11:03:27.306: E/AndroidRuntime(13787): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:673)
11-20 11:03:27.306: E/AndroidRuntime(13787): ... 18 more
Ich denke, das die meisten impportant:
Duplicate id 0x7f05000c, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.maps.MapFragment
also das ist mein code:
LoginScreen:eine fragmentActivity, die alle rufen für das fragment
public class LoginScreen extends FragmentActivity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
//nav drawer title
private CharSequence mDrawerTitle;
//used to store app title
private CharSequence mTitle;
//slide menu items
private String[] navMenuTitles;
private TypedArray navMenuIcons;
private ArrayList<NavDrawerItem> navDrawerItems;
private NavDrawerListAdapter adapter;
MapFragment mMap;
GoogleMap googleMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login_screen);
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
if(status == ConnectionResult.SUCCESS) {
//what you want to do
Toast.makeText(getApplicationContext(), "good connection", Toast.LENGTH_SHORT).show();
}
// setUpMapIfNeeded();
//addTwitterMarq();
mTitle = mDrawerTitle = getTitle();
//load slide menu items
navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
//nav drawer icons from resources
navMenuIcons = getResources()
.obtainTypedArray(R.array.nav_drawer_icons);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
navDrawerItems = new ArrayList<NavDrawerItem>();
//adding nav drawer items to array
//Home
navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
//Find People
navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
//Photos
navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
//Communities, Will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1), true, "22"));
//Pages
navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
//What's hot, We will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), true, "50+"));
//Recycle the typed array
navMenuIcons.recycle();
mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
//setting the nav drawer list adapter
adapter = new NavDrawerListAdapter(getApplicationContext(),
navDrawerItems);
mDrawerList.setAdapter(adapter);
//enabling action bar app icon and behaving it as toggle button
getActionBar().setDisplayHomeAsUpEnabled(true);
//getActionBar().setHomeButtonEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, //nav menu toggle icon
R.string.app_name, //nav drawer open - description for accessibility
R.string.app_name //nav drawer close - description for accessibility
) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
//calling onPrepareOptionsMenu() to show action bar icons
invalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
//calling onPrepareOptionsMenu() to hide action bar icons
invalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState == null) {
//on first time display view for first nav item
displayView(0);
}
}
/**
* Slide menu item click listener
* */
private class SlideMenuClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
//display view for selected nav drawer item
displayView(position);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//toggle nav drawer on selecting action bar app icon/title
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
//Handle action bar actions click
switch (item.getItemId()) {
case R.id.action_settings:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/* *
* Called when invalidateOptionsMenu() is triggered
*/
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
//if nav drawer is opened, hide the action items
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
/**
* Diplaying fragment view for selected nav drawer list item
* */
private void displayView(int position) {
//update the main content by replacing fragments
Fragment fragment = null;
switch (position) {
case 0:
fragment = new HomeFragment();
break;
case 1:
fragment = new FindPeopleFragment();
break;
case 2:
fragment = new PhotosFragment();
break;
case 3:
fragment = new CommunityFragment();
break;
case 4:
fragment = new PagesFragment();
break;
case 5:
fragment = new WhatsHotFragment();
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).commit();
//update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
} else {
//error in creating fragment
Log.e("MainActivity", "Error in creating fragment");
}
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
/**
* When using the ActionBarDrawerToggle, you must call it during
* onPostCreate() and onConfigurationChanged()...
*/
@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 toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
private void addTwitterMarq() {
//TODO Auto-generated method stub
LatLng pos = new LatLng(48.85078, 2.34440);
googleMap.addMarker(new MarkerOptions()
.title("Twitter")
.snippet("Twitter HQ")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
.position(pos)
);
}
private void setUpMapIfNeeded() {
//TODO Auto-generated method stub
if (googleMap == null) {
//Try to obtain the map from the SupportMapFragment.
googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
//Check if we were successful in obtaining the map.
googleMap.setMyLocationEnabled(true);
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
if (googleMap != null) {
//setUpMap();
drawTestJunk();
}
}
}
private void drawTestJunk() {
//TODO Auto-generated method stub
UiSettings settings = googleMap.getUiSettings();
settings.setZoomControlsEnabled(true);
settings.setCompassEnabled(true);
settings.setTiltGesturesEnabled(false);
settings.setMyLocationButtonEnabled(true);
CameraUpdate camUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(45.53, -73.59), 14);
googleMap.moveCamera(camUpdate);
/**
* "Markers" lesson
*/
googleMap.addMarker(new MarkerOptions()
.position(new LatLng(45.538490,-73.598480))
.title("Hello world")
.snippet("what does a snippet look like?")
.draggable(true)
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
);
/**
* skipping other "Marker" lessons, to move on to Lines, Polygons, and Circles.
* Topic list for later study:
* - Customized info windows
* - Marker click events
* - Marker drag events
* - Info window click events
*/
/**
* "Lines, Polygons, and Circles" lesson
*/
//LINE
PolylineOptions route = new PolylineOptions()
.add(new LatLng(45.538451240403596, -73.59851807077722) )
.add(new LatLng(45.5390432, -73.5997465) )
.add(new LatLng(45.5387234, -73.6000517) )
.add(new LatLng(45.5389376, -73.6005275) )
.color(Color.GREEN)
;
Polyline polyline = googleMap.addPolyline(route);
//you can also call PolylineOptions.addAll(Iterable<LatLng>) if the points are already in a list
//POLYGON
ArrayList<LatLng> hole= new ArrayList<LatLng>();
hole.add(new LatLng(45.5275, -73.5925));
hole.add(new LatLng(45.5225, -73.5925));
hole.add(new LatLng(45.5225, -73.5975));
hole.add(new LatLng(45.5275, -73.5975));
PolygonOptions rectOptions = new PolygonOptions()
.add(new LatLng(45.53, -73.59),
new LatLng(45.52, -73.59),
new LatLng(45.52, -73.60),
new LatLng(45.53, -73.60),
new LatLng(45.53, -73.59))
.addHole(hole)
.strokeColor(Color.RED)
.fillColor(Color.BLUE);
Polygon polygon = googleMap.addPolygon(rectOptions);
//And sure, why not, a CIRCLE
CircleOptions circleOptions = new CircleOptions()
.center(new LatLng(45.525, -73.595))
.radius(100);
Circle circle = googleMap.addCircle(circleOptions);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.login_screen, menu);
return true;
}
}
und das ist mein Haupt-layout der fragmentActivity:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Framelayout to display Fragments -->
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
<!--
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment"/>
-->
<!-- Listview to display slider menu -->
<ListView
android:id="@+id/list_slidermenu"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@color/list_divider"
android:dividerHeight="1dp"
android:listSelector="@drawable/list_selector"
android:background="@color/list_background"/>
</android.support.v4.widget.DrawerLayout>
- und dies ist das xml-layout der mapfragment:
<?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/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment"/>
</RelativeLayout>
- und dies ist die mapfragment code:
public class HomeFragment extends Fragment {
int mCurrentPosition = -1;
MapFragment mMap;
GoogleMap googleMap;
final static String ARG_POSITION = "position";
public HomeFragment(){}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (savedInstanceState != null) {
mCurrentPosition = savedInstanceState.getInt(ARG_POSITION);
}
View rootView = inflater.inflate(R.layout.fragment_map, container, false);
// int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
// if(status == ConnectionResult.SUCCESS) {
// //what you want to do
// //Toast.makeText(getApplicationContext(), "good connection", Toast.LENGTH_SHORT).show();
// }
setUpMapIfNeeded();
addTwitterMarq();
return rootView;
}
private void addTwitterMarq() {
//TODO Auto-generated method stub
LatLng pos = new LatLng(48.85078, 2.34440);
googleMap.addMarker(new MarkerOptions()
.title("Twitter")
.snippet("Twitter HQ")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
.position(pos)
);
}
private void setUpMapIfNeeded() {
//TODO Auto-generated method stub
if (googleMap == null) {
//Try to obtain the map from the SupportMapFragment.
googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
//Check if we were successful in obtaining the map.
googleMap.setMyLocationEnabled(true);
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
if (googleMap != null) {
//setUpMap();
drawTestJunk();
}
}
}
private void drawTestJunk() {
//TODO Auto-generated method stub
UiSettings settings = googleMap.getUiSettings();
settings.setZoomControlsEnabled(true);
settings.setCompassEnabled(true);
settings.setTiltGesturesEnabled(false);
settings.setMyLocationButtonEnabled(true);
CameraUpdate camUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(45.53, -73.59), 14);
googleMap.moveCamera(camUpdate);
/**
* "Markers" lesson
*/
googleMap.addMarker(new MarkerOptions()
.position(new LatLng(45.538490,-73.598480))
.title("Hello world")
.snippet("what does a snippet look like?")
.draggable(true)
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
);
/**
* skipping other "Marker" lessons, to move on to Lines, Polygons, and Circles.
* Topic list for later study:
* - Customized info windows
* - Marker click events
* - Marker drag events
* - Info window click events
*/
/**
* "Lines, Polygons, and Circles" lesson
*/
//LINE
PolylineOptions route = new PolylineOptions()
.add(new LatLng(45.538451240403596, -73.59851807077722) )
.add(new LatLng(45.5390432, -73.5997465) )
.add(new LatLng(45.5387234, -73.6000517) )
.add(new LatLng(45.5389376, -73.6005275) )
.color(Color.GREEN)
;
Polyline polyline = googleMap.addPolyline(route);
//you can also call PolylineOptions.addAll(Iterable<LatLng>) if the points are already in a list
//POLYGON
ArrayList<LatLng> hole= new ArrayList<LatLng>();
hole.add(new LatLng(45.5275, -73.5925));
hole.add(new LatLng(45.5225, -73.5925));
hole.add(new LatLng(45.5225, -73.5975));
hole.add(new LatLng(45.5275, -73.5975));
PolygonOptions rectOptions = new PolygonOptions()
.add(new LatLng(45.53, -73.59),
new LatLng(45.52, -73.59),
new LatLng(45.52, -73.60),
new LatLng(45.53, -73.60),
new LatLng(45.53, -73.59))
.addHole(hole)
.strokeColor(Color.RED)
.fillColor(Color.BLUE);
Polygon polygon = googleMap.addPolygon(rectOptions);
//And sure, why not, a CIRCLE
CircleOptions circleOptions = new CircleOptions()
.center(new LatLng(45.525, -73.595))
.radius(100);
Circle circle = googleMap.addCircle(circleOptions);
}
@Override
public void onResume() {
//TODO Auto-generated method stub
super.onResume();
//setUpMapIfNeeded();
//addTwitterMarq();
}
@Override
public void onSaveInstanceState(Bundle outState) {
//TODO Auto-generated method stub
super.onSaveInstanceState(outState);
outState.putInt(ARG_POSITION, mCurrentPosition);
}
public void updateArticleView(int position) {
mCurrentPosition = position;
}
@Override
public void onStart() {
//TODO Auto-generated method stub
super.onStart();
Bundle args = getArguments();
if (args != null) {
//Set article based on argument passed in
updateArticleView(args.getInt(ARG_POSITION));
} else if (mCurrentPosition != -1) {
//Set article based on saved instance state defined during onCreateView
updateArticleView(mCurrentPosition);
}
}
}
Ich denke, das problem liegt in der onResume & onCreateView Methoden!!
Hoffe, Ihr werdet mir helfen
danke.
InformationsquelleAutor Ines Belhouchet | 2013-11-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
verwenden Sie diese
- und override-Methode
onDestroyView()
- und Nur diesen code inonDestroyView()
Vielen Dank, diese Lösung funktioniert bei mir 🙂
Vielen Dank hardik.. funktioniert wie ein Charme!!!!!
Ich habe versucht, diese Lösung, und während er arbeitete, auf den ersten, wenn ich drehte das Gerät in den landscape/portrait bekam ich eine IllegalStateException, wenn ich versuchte commit(). Es gibt andere Beiträge auf SO darüber zu reden; das kann man nicht Begehen, nachdem ein onStop oder onSaveInstanceState aufgerufen wurde, die auf das fragment.
Sie können commitAllowingStateLoss () - Methode anstelle von "commit" - und stellen Sie sicher, Sie haben Attribute, um Ihre Aktivität android:configChanges="screenSize|Orientierung" in android manifiest Datei
InformationsquelleAutor Hardik
Versuchen zur Wiederverwendung/wiederverwertung Ihres Layouts.
Ich bin mit in die "doppelte id" bei der Verwendung eines Kartenausschnitts.
So in onCreateView statt
ich bin mit
Diese Antwort ist viel besser. Mit der gewählten Antwort die Methode, die ich meine app stürzt ab wegen IllegalStateExceptions. Versuch, commit() nach onStop oder nach onSaveInstanceState auslösen wird. Der einfachste Weg, dies zu sehen ist, biegen Sie Ihr Handy in portrait/Landschaft.
Eine bessere Antwort als die akzeptierte. Dabei behält man den vorherigen Zustand des fragments. Ich danke Ihnen sehr, bro.
Vielen Dank, diese Lösung funktioniert bei mir 🙂
Diese Lösung funktioniert bei mir auch! danke! 🙂
InformationsquelleAutor kosemuckel
Ich denke, Sie müssen versuchen, das abrufen von alten Fragmente Instanz statt neu es jedes mal eine Schublade Element ausgewählt ist. In Ihrem displayView Methode der LoginScreen Aktivität, müssen Sie etwas tun, wie das in den Schalter:
InformationsquelleAutor lithos35