Ошибка раздувания фрагмента в диалоге во второй раз - PullRequest
12 голосов
/ 10 августа 2011

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

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

Ответы [ 6 ]

27 голосов
/ 15 декабря 2011

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

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

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

5 голосов
/ 19 февраля 2013

У меня была похожая проблема

Я решил ее очень просто

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

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

<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();
                    }
                });
1 голос
/ 01 июля 2016
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();
1 голос
/ 31 октября 2014

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

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

Попробуйте следующим образом

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

}

0 голосов
/ 28 марта 2015

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

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