Ошибка раздувания фрагмента в диалоге второй раз

У меня есть следующий код в Activity, который запускает диалог для макета, который содержит фрагмент.

... case R.id.pick_resource: dialog = new Dialog(this); dialog.setContentView(R.layout.resource_picker); dialog.setCancelable(true); dialog.setTitle("Pick a resource"); dialog.show(); 

Это работает очень хорошо в первый раз после запуска приложения, но когда диалог завершается, а затем снова вызван, я получаю эту трассировку стека:

 08-10 10:47:33.990: ERROR/AndroidRuntime(26521): FATAL EXCEPTION: main android.view.InflateException: Binary XML file line #7: Error inflating class fragment at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688) at android.view.LayoutInflater.rInflate(LayoutInflater.java:724) at android.view.LayoutInflater.inflate(LayoutInflater.java:479) at android.view.LayoutInflater.inflate(LayoutInflater.java:391) at android.view.LayoutInflater.inflate(LayoutInflater.java:347) at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:224) at android.app.Dialog.setContentView(Dialog.java:449) at org.rhq.pocket.StartActivity.onOptionsItemSelected(StartActivity.java:118) at android.app.Activity.onMenuItemSelected(Activity.java:2390) at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:852) at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153) at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:956) at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:174) at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:85) at android.view.View.performClick(View.java:3100) at android.view.View$PerformClick.run(View.java:11644) at android.os.Handler.handleCallback(Handler.java:587) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:126) at android.app.ActivityThread.main(ActivityThread.java:3997) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:491) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.IllegalArgumentException: Binary XML file line #7: Duplicate id 0x7f090007, tag null, or parent id 0xffffffff with another fragment for org.rhq.pocket.ResourcePickerFragement at android.app.Activity.onCreateView(Activity.java:4089) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:664) ... 24 more 

Любая идея, что может вызвать это исключение? Мне нужно как-то разгрузить фрагмент?

Solutions Collecting From Web of "Ошибка раздувания фрагмента в диалоге второй раз"

Имеет ли фрагмент в вашем макете атрибут android: id?

Я подозреваю, что это происходит из-за того, что фрагмент создается каждый раз, когда ваш макет раздувается, в первый раз, когда идентификатор не используется, но во второй раз FragmentManager все еще думает, что ваш фрагмент жив, поэтому идентификатор считается дубликатом.

Попробуйте удалить атрибут android: id из вашего фрагмента, если он существует, или добавить компоновщик-заполнитель, такой как frameelayout, и использовать фрагментацию для динамического добавления фрагмента каждый раз, когда будет создан ваш диалог.

У меня была аналогичная проблема

Я решил это очень легко

Удаление всех фрагментов при закрытом диалоге

Это мой диалог

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="310dp" android:layout_height="260dp" > <fragment android:layout_width="310dp" android:layout_height="260dp" android:tag="one" class="com.android.mushrooms.CookingProgressFragment" /> <fragment android:layout_width="310dp" android:layout_height="260dp" android:tag = "two" class="com.android.mushrooms.CookingInfoFragment" /> </RelativeLayout> 

И это происходит, когда вы удаляете диалог

 dialog.findViewById(R.id.cifButtonClose) .setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mDragController.endDrag(); FragmentTransaction ft2 = getSupportFragmentManager() .beginTransaction(); ft2.remove( getSupportFragmentManager() .findFragmentByTag("one")); ft2.remove( getSupportFragmentManager() .findFragmentByTag("two")); ft2.commit(); dialog.dismiss(); } }); 

Попробуйте следующее

 public class ABDCD{ private Dialog dialog = null; private View viewHoldingDialog = null; ---------------------------- case R.id.pick_resource: dialog = new Dialog(this,R.style.Theme_Dialog_Translucent); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); viewHoldingDialog = (ViewGroup) layoutInflater.inflate( R.layout.resource_picker, null); dialogLayoutParams = new LayoutParams(android.view.WindowManager.LayoutParams.WRAP_CONTENT, android.view.WindowManager.LayoutParams.WRAP_CONTENT); dialog.addContentView(viewHoldingDialog, dialogLayoutParams); 

}

Может быть, это может помочь кому-то:

Я использую код Эвансгелист Evansgelist, но с DialogFragment, который имеет макет с MapFragment, код должен быть в блоке ondestroy:

 @Override public void onDestroy(){ super.onDestroy(); FragmentTransaction ft2 = getActivity().getFragmentManager() .beginTransaction(); ft2.remove( getFragmentManager() .findFragmentById(R.id.map_map)); ft2.commit(); } 

Это мой макет:

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout 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" tools:context="com.example" > <fragment android:id="@+id/map_map" android:layout_width="match_parent" android:layout_height="match_parent" android:name="com.google.android.gms.maps.MapFragment"/> </FrameLayout> 
 On android.view.inflateexception: binary xml file line #8: error inflating class fragment error : 

Попробуйте удалить атрибут android: id из вашего фрагмента, если он существует. И в диалоговом окне увольнения добавьте следующий код: он работает для меня

 activity.getFragmentManager().beginTransaction().remove(activity.getFragmentManager().findFragmentById(R.id.mMap_location)).commit(); 

Другой ответ, который может помочь кому-то другому: у меня была аналогичная проблема, но вместо того, чтобы уничтожить фрагмент в onDestroy, мне пришлось переместить его на onPause, чтобы заставить его работать:

 @Override protected void onPause() { if(adFragment != null){ childFragmentManager.beginTransaction().remove(adFragment).commitAllowingStateLoss(); } super.onPause(); }