Obtention de l'erreur, tout en ajoutant des fragments dynamiquement -java.lang.IllegalStateException:
-
26-10-2019 - |
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: (
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();
}
}
}
}
-
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)
-
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.