Obtention de l'erreur, tout en ajoutant des fragments dynamiquement -java.lang.IllegalStateException:

StackOverflow https://stackoverflow.com/questions/7807676

Question

Je travaille sur 3.0 pour la première fois. Je veux ajouter des fragments dynamiquement , mais son erreur montré: -

10-18 18:29:11.215: ERROR/AndroidRuntime(3550): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

code XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/frags">

<ListView
        android:id="@+id/number_list"
        android:layout_width="250dip"
        android:layout_height="match_parent" />

<FrameLayout
        android:id="@+id/the_frag"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

Activité

public class FragmentExampleActivity extends Activity implements
    OnItemClickListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ListView l = (ListView) findViewById(R.id.number_list);
    ArrayAdapter<String> numbers = new ArrayAdapter<String>(
            getApplicationContext(), android.R.layout.simple_list_item_1,
            new String[] { "one", "two", "three", "four", "five", "six" });
    l.setAdapter(numbers);
    l.setOnItemClickListener(this);
}

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    Fragment f = new FragmentExample();

    FragmentTransaction ft = getFragmentManager().beginTransaction();       
    ft.replace(R.id.the_frag, f);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.addToBackStack(null);
    ft.commit();

}
}


public class FragmentExample extends Fragment {
private int nAndroids=1;

public FragmentExample() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saved) {
    int n;

    View l = inflater.inflate(R.layout.textlay,container);
    TextView tv = (TextView) l.findViewById(R.id.textView1);
    tv.setText("value "+nAndroids);

    return l;
}

}

Plz mettre un peu de lumière sur, où je vais mal: (

Était-ce utile?

La solution

Au lieu d'utiliser

View l = inflater.inflate(R.layout.textlay,container);

vous devez utiliser

View l = inflater.inflate(R.layout.textlay, container, false);

ou bien

View l = inflater.inflate(R.layout.textlay, null );

Je vous suggère fortement d'utiliser, la version de inflate qui prend trois paramètres. Android utiliser le conteneur uniquement pour but params de la mise en page. En passant false en tant que troisième paramètre, empêche l'ajout de textlay, à container et fixe votre problème

Autres conseils

si onCreateView (), vous souhaitez réutiliser vue, alors vous pouvez traiter onDestroyView ()

@Override
public void onDestroyView() {
    super.onDestroyView();
    if (view != null) {
        ViewGroup parentViewGroup = (ViewGroup) view.getParent();
        if (parentViewGroup != null) {
            parentViewGroup.removeAllViews();
        }
    }
}

ou vous pouvez utiliser troisième argument et le transmettre comme un faux.

inflater.inflate(R.layout.sample_fragment, container,false);

cela signifie que ne pas attacher la vue actuelle à la racine.

Les multiples problèmes suivants Résout:

public static View contentView;

public static class MenuCardFrontFragment extends Fragment {
    public MenuCardFrontFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        try
        {
            LinearLayout frontLayout = (LinearLayout)inflater.inflate(R.layout.content_card, container, false);
            // modify layout if necessary
            return contentView = frontLayout;
        } catch (InflateException e) {
            return contentView;
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (contentView != null) {
            ViewGroup parentViewGroup = (ViewGroup) contentView.getParent();
            if (parentViewGroup != null) {
                parentViewGroup.removeAllViews();
            }
        }
    }
}
  1. Si des fragments avec des spectacles d'animation et l'utilisateur forcé de répéter l'animation avant qu'il ne soit terminé. ex: appuyer sur le bouton de menu deux fois avant le fragment de menu se termine et animant apparaissent. (Cela a résolu le onDestryView de user2764384)

  2. Si la méthode appelée décompressé avec la spécification du conteneur pour obtenir conteneur était sortie. il semble que ce cas un problème car à la 2ème fois qui est arrivé le vieux conteneur ont déjà vue. donc si cette exception se produit, il sera pris et retourne l'ancienne vue contentView.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top