Domanda

Sto lavorando a 3.0 per la prima volta. Voglio aggiungere frammenti dinamicamente , , ma il suo errore indicato: -

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.

codice 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" />

attività

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 mettere un po 'di luce su, dove sto andando male: (

È stato utile?

Soluzione

Invece di usare

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

si dovrebbe usare

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

oppure

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

vi consiglio caldamente di utilizzare la versione di inflate che prende tre parametri. Android utilizzare il contenitore solo per params lo scopo del layout. Passando false come terzo parametro, impedisce l'aggiunta di textlay, per container e correzioni del problema

Altri suggerimenti

Se in onCreateView (), si desidera riutilizzare vista, allora si può fare con onDestroyView ()

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

oppure è possibile utilizzare terzo argomento e passare come un falso.

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

Ciò significa che non attribuiscono vista corrente a root.

I seguenti Risolve molteplici problemi:

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. Se frammenti spettacoli con animazione e utenti costretti a ripetere l'animazione prima che sia finita. es: premendo due volte il tasto menu prima il frammento di menu termina l'animazione e appaiono. (Questo ha risolto dalla onDestryView da user2764384)

  2. Se il metodo gonfiare chiamato con specificando il contenitore per ottenere il contenitore laici gita. sembra che che i casi un problema perché al 2 ° volta che è successo il vecchio contenitore già avere una visione. quindi se questo accada eccezione sarà catturato e ritorna la vecchia vista contentView.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top