Android ScrollView può ospitare solo un figlio diretto

Ho un onclick ascoltatore dalla galleria che dovrebbe cancellare tutte le righe all’interno della tableview, quindi aggiungere la riga/righe di una tableview all’interno di una scrollview. Il frammento dovrebbe cambiare su ogni clic del mouse.

Tuttavia io sono sempre: java.lang.IllegalStateException: ScrollView può ospitare solo un figlio diretto.

myactivity pulsante ascoltatore

            TrackerFragment tf = (TrackerFragment) getFragmentManager().findFragmentById(R.id.tracker1);
            tf = TrackerFragment.newInstance(listOfList.get(id).get(position));

            fragmentTransaction.add(R.id.tracker1, tf);
            fragmentTransaction.commit();
            t1 = true; //being used
            getFragmentManager().executePendingTransactions();

tracker frammento

public class TrackerFragment extends Fragment
{
    private Dish dish;

    public static TrackerFragment newInstance(Serializable dish) 
    {
        TrackerFragment tf = new TrackerFragment();

        Bundle args = new Bundle();
        args.putSerializable("dish", dish);
        tf.setArguments(args);

        return tf;
    }

    public static TrackerFragment newInstance(Bundle bundle)
    {
        Dish dish = (Dish) bundle.getSerializable("dish");
        return newInstance(dish);
    }

    @Override
    public void onCreate(Bundle myBundle)
    {
        super.onCreate(myBundle);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) 
    {
        View v = inflater.inflate(R.layout.tracker, container, false);

        TableLayout tableLayout = (TableLayout) v.findViewById(R.id.tracker_layout);
        tableLayout.removeAllViews();

        if (dish != null)
        {   
            //display others

            //display subsystem stuff
            for (int i = 0; i < dish.getSubsystems().size(); i++)
            {
                TableRow tableRow = new TableRow(v.getContext());
                tableRow.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));

                TextView tv = new TextView(v.getContext());
                tv.setText(dish.getSubsystems().get(i).getConnFuncAddr());

                tableRow.addView(tv);

                tableLayout.addView(tableRow);
            }
        }
        else
        {
            TableRow tableRow = new TableRow(v.getContext());
            tableRow.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));

            TextView tv = new TextView(v.getContext());
            tv.setText("Click on image to view more data");

            tableRow.addView(tv);

            tableLayout.addView(tableRow);
        }

        return v;
    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Trackers -->
    <LinearLayout
        android:layout_height="fill_parent"
        android:layout_width="300dp"
        android:layout_weight="1"
        android:orientation="vertical">

        <fragment 
            android:name="android.gallery.TrackerFragment"
            android:id="@+id/tracker1"
            android:layout_height="500dp"
            android:layout_width="300dp"
            android:layout_weight="1">
        </fragment>

    </LinearLayout>

    <!-- Gallery -->
    <LinearLayout
        android:layout_height="fill_parent"
        android:layout_width="600dp"
        android:layout_weight="1"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="245dp">

            <Gallery 
                android:id="@+id/galleryid0"
                android:layout_width="fill_parent" 
                android:layout_height="match_parent"/>

        </LinearLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="245dp">

            <Gallery 
                android:id="@+id/galleryid1"
                android:layout_width="fill_parent" 
                android:layout_height="match_parent"/>

        </LinearLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="245dp">

            <Gallery 
                android:id="@+id/galleryid2"
                android:layout_width="fill_parent" 
                android:layout_height="match_parent"/>

            </LinearLayout>

        </LinearLayout>

</LinearLayout>

tracker.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

    <TableLayout 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"
        android:id="@+id/tracker_layout">

    </TableLayout>

</ScrollView>

Qualcuno sa che cosa è sbagliato? Sto indovinando che io sono l’aggiunta di una riga di tabella per la scrollview e non tableview, tuttavia, non vedo dove sto facendo di sbagliato nel mio codice.

InformationsquelleAutor Raptrex | 2011-06-30



8 Replies
  1. 5

    Infatti, è possibile non avere cose come :

    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView
    android:id="@+id/widget27"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffffff"
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <TableLayout
    android:id="@+id/layoutOption"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffffff"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    >
    <ImageView
    android:id="@+id/logoImmoweb"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/logoimmoweb"
    android:layout_gravity="top"
    />
     ...
    </TableLayout>
    </ScrollView>

    ma se hai un ulteriore elemento al di fuori della tabella, è scontro con un java.lang.IllegalStateException: ScrollView can host only one direct child

    esempio

    <ScrollView
    android:id="@+id/widget27"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffffff"
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <ImageView
    android:id="@+id/logoImmoweb"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/logoimmoweb"
    android:layout_gravity="top"
    />
    <TableLayout
    android:id="@+id/layoutOption"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffffff"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    >
    ...
    </TableLayout>
    </ScrollView>

    Spero che questo aiuto.

  2. 4

    So che questa domanda è abbastanza vecchio, ma mi sono imbattuto nello stesso problema e va a finire che si posso avere una ScrollView come è vista di base per il layout.

    Basta avvolgere la Scrollview nel tracker.xml layout con un RelativeLayout e si dovrebbe essere buono per andare

  3. 2

    Un’altra possibilità è che l’elemento di chiusura non è di corrispondenza. Ie.

    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="wrap_content">
        <LinearLayout ...>
            ...
        </LinearLayout>
    </LinearLayout>

    L’errore è nell’ultima riga.

  4. 1

    Ehm… non mettere più viste all’interno di un rotolo di vista. Mettere una singola vista all’interno di esso che è il tipo di layout che si desidera per il vostro viste multiple — TableLayout, FrameLayout, etc.

    • Non è l’unico bambino nella mia scrollview è tablelayout?
    • Non credo di poter leggere il suo esempio…
    • Se l’eccezione sta accadendo, si sono sempre più viste nella scorrere. Perché? Ha aggiunto un’eccezione qui sotto. A quanto pare lui è l’aggiunta di un frammento di vista della gerarchia a scorrere.
  5. 0

    modifica (2 ° risposta):

    Ho giocato con il codice e io non sono ancora sicuro del PERCHÉ questo accade, sicuramente c’è qualcosa di sbagliato sul frammento manager quando scambio di frammenti (sostituisci(resId, frammento))

    Nel mio frammento onCreateView è questo codice:

        View view = inflater.inflate(R.layout.post_fragment, null, false);
        if (item == null)
            return view;
    
        return BuildView(view);

    post_fragment è una tela vuota con 1 ScrollView, 1 LinearLayout all’interno di esso, e alcuni altri ViewGroups all’interno di esso. Questo è a carico di una tela vuota il 1 ° carico (voce è nullo) e il 2 ° tempo, attraverso un input dell’utente, potrebbe ottenere il reale di dati da visualizzare.

    per qualche ragione, al di là delle mie conoscenze, come si è visto nel logcat, FragmentManagerImpl.moveToState stava chiamando ScrollView.AddChild la causa dell’errore.

    Ora ho cambiato il mio frammenti onCreateView a:

        if (item == null)
            return inflater.inflate(R.layout.empty, null, false);
    
        View view = inflater.inflate(R.layout.post_fragment, null, false);
        return BuildView(view);

    in modo che il ‘vuoto’ di tela è un FrameLayout con nulla su di esso, e ora tutto funziona felicemente.
    Sono sicuro che questo suona come un qualche strano errore sul numero effettivo di frammenti quadro, ma è un lavoro intorno ad esso.

    1 ° risposta:

    Raptrex, per quanto posso vedere. Sì, layout di tabella è solo un bambino il tuo scrowview hanno. Io sto avendo lo stesso identico problema, e molto frustrato cercando di risolverlo.

    Dal LogCat/Debug, sembra che c’è qualcosa in Frammenti di gestione e di chiamata .AddView(vista) nel mio ScrollView (controllare il log) dipende come faccio a cambiare il mio XML di layout ottengo questo errore o meno, diciamo che sembra abbastanza assurdo!!

    Qualche idea di come?perché?cosa???? Sto ascoltando…

    FATAL EXCEPTION: main
    java.lang.IllegalStateException: ScrollView can host only one direct child
    at android.widget.ScrollView.addView(ScrollView.java:219)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:787)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:977)
    at android.app.BackStackRecord.run(BackStackRecord.java:638)
    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1309)
    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:398)
    at android.os.Handler.handleCallback(Handler.java:587)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:132)
    at android.app.ActivityThread.main(ActivityThread.java:4123)
    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)
    • E che cosa è la “voce”? Un qualche tipo di variabile inizializzata in onCreateView()?
  6. 0

    Tenta di utilizzare un <FrameLayout> invece di <fragment> nel main.xml

    Così, invece di

    <fragment 
        android:name="android.gallery.TrackerFragment"
        android:id="@+id/tracker1"
        android:layout_height="500dp"
        android:layout_width="300dp"
        android:layout_weight="1">
    </fragment>

    utilizzare

    <FrameLayout
        android:id="@+id/tracker1"
        android:layout_height="500dp"
        android:layout_width="300dp"
        android:layout_weight="1"
    />

    Ha risolto un problema simile con la ScrollView, dove mi è stato di sostituire il frammento di attività:

    getSupportFragmentManager().beginTransaction()
        .replace(R.id.details_container, new DetailsFragment(), DETAILFRAGMENT_TAG)
        .commit();

Lascia un commento