Подтвердить что ты не робот

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

У меня есть следующий код в 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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

}

Ответ 4

Возможно, это может помочь кому-то:

Я использую код Эвансгелист 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>

Ответ 5

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

Ответ 6

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

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