Pytanie Błąd nadmuchania fragmentu w oknie dialogowym po raz drugi


Mam następujący kod w działaniu, które uruchamia okno dialogowe dla układu zawierającego fragment.

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

Działa to bardzo dobrze za pierwszym razem po uruchomieniu aplikacji, ale kiedy okno dialogowe jest zamykane, a następnie wywoływane ponownie, pojawia się ślad stosu:

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

Każdy pomysł, co może spowodować ten wyjątek? Czy muszę jakoś wyładować fragment?


12
2017-08-10 08:55


pochodzenie


gdzie zadeklarowałeś zmienną "dialogową"? sprawdź, czy zadeklarowałeś "dialog" jako zmienną klasy, czy też nie. - jainal
dodanie trochę kodu pomoże nam zrozumieć problem - ngesh
@Jainal w ramach działania, ale to się nie zmienia, gdy wstawiam okno dialogowe = nowe okno dialogowe (to). - Heiko Rupp


Odpowiedzi:


Czy fragment w twoim układzie ma atrybut android: id?

Podejrzewam, że dzieje się tak dlatego, że fragment jest tworzony za każdym razem, gdy układ jest zawyżony, przy pierwszym użyciu identyfikatora nie jest używany, ale za drugim razem, gdy FragmentManager nadal uważa, że ​​Twój fragment jest żywy, więc identyfikator jest uważany za duplikat.

Spróbuj usunąć atrybut android: id ze swojego fragmentu, jeśli istnieje, lub dodaj układ zastępczy, taki jak framelayout i użyj fragmenttransaction, aby dynamicznie dodawać fragment za każdym razem, gdy tworzone jest okno dialogowe.


26
2017-12-15 00:41



Wow, szukałem przez 6 godzin, dlaczego dostaję duplikat błędu ID podczas próby dodania / usunięcia fragmentów z kontenera. Jesteś ratunkiem dla życia i zdrowia: D Awesomness! ^^ - span
Usunięcie identyfikatora / tagu fragmentu działa, ale zakłada, że ​​nie musisz szukać odnośnika do niego. Dodanie fragmentu programowo (jak wspomniano) jest jedną z opcji. Programowe usuwanie go, gdy okno dialogowe jest odrzucane (np. W narzędziu OnDismissListener), jest inne. To podejście zadziałało dobrze. - spaaarky21
To nie działa dla mnie. Jeśli usunę identyfikator, otrzymam wyjątek: Binarna linia pliku XML # 103: należy podać unikalny identyfikator android: id, android: lub rodzic o identyfikatorze com.google.android.gms.maps.MapFragment - Ted
Każdy pomysł, dlaczego tak myśli, kiedy rodzic jest całkowicie zniszczony? - Ashok Koyi
Dla tych, którzy muszą określić unique android:id, android:tag, or have a parent with an id for ..., możesz zawijać <fragment> na przykład <RelativeLayout> i podaj id RelativeLayout i usuń wszelkie id z fragmentu. - altruistic


Miałem podobny problem

Rozwiązałem to bardzo łatwo

usuwanie wszystkich fragmentów przy zamkniętym oknie dialogowym

To jest moje okno dialogowe

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

i tak się dzieje, gdy usuniesz okno dialogowe

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

5
2018-02-19 19:46



Dziękuję. Rozwiązałem mój problem - Ashutosh Salodkar


Spróbuj wykonać następujące czynności

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

}


1
2017-08-10 11:51





Może to może pomóc komuś:

Używam kodu Эвансгелист Evansgelist, ale z DialogFragment, który ma układ z MapFragment, kod musi być blokiem OnDestroy:

@Override
public void onDestroy(){
    super.onDestroy();
    FragmentTransaction ft2 = getActivity().getFragmentManager()
            .beginTransaction();

    ft2.remove( getFragmentManager()
            .findFragmentById(R.id.map_map));
    ft2.commit();
}

To jest mój układ:

<?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
2017-10-31 04:03



to jest właściwa odpowiedź. Dzwonię dismiss() wewnątrz onPause następnie usuń fragment wewnątrz onDismiss - M D P
Wielkie dzięki @M D P. Twoje rozwiązanie jest dla mnie jedynym rozwiązaniem. - Hashir Baig


On android.view.inflateexception: binary xml file line #8: error inflating class fragment error :

Spróbuj usunąć atrybut android: id ze swojego fragmentu, jeśli istnieje. iw oknie dialogowym odrzucania dodaj następujący kod: to działa dla mnie

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

1
2017-07-01 12:46





Inna odpowiedź, która mogłaby pomóc komuś innemu: Miałem podobny problem, ale zamiast niszczyć fragment w onDestroy, musiałem go przenieść do trybu onPause, aby uruchomić go:

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

0
2018-03-28 13:57