Android ScrollView può ospitare solo un figlio diretto

Ho un ascoltatore onclick dalla galleria che dovrebbe cancellare tutte le righe all'interno della tabella, quindi aggiungere righe / righe a una tabella all'interno di una window di scorrimento. Il frammento dovrebbe cambiare each clic del button.

Tuttavia sto ottenendo: java.lang.IllegalStateException: ScrollView può ospitare solo un figlio diretto.

  • Applicazione Android utilizzando opencv: come salvare un'image senza sovrascrivere?
  • Il risultato di Android REST XML in Listview
  • BitmapFactory.decodeByteArray () restituisce NULL
  • Come iniziare con lo sviluppo di Android con il nido d'ape
  • Come submit il token in intestazione al server in Android
  • Perché ListView.getCheckedItemPositions () non restituisce valori corretti?
  • ascoltatore pulsanti di miastività

    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 fragment

     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 cosa è sbagliato? Sto indovinando che aggiungo una row di tabella al quadro di scorrimento e non il tabellone, tuttavia, non vedo where faccio quello sbagliato nel mio codice.

  • Android: Comunicazione seriale RS232 con dispositivo Android
  • Android: espandere / crollare l'animation
  • Timer Android che aggiorna una visualizzazione di text (UI)
  • Duplicare i file copiati (Android Studio 0.4.0)
  • Come aggiungere una notifica di spinta nella mia applicazione android
  • Come visualizzare una list di due colonne in Android?
  • 7 Solutions collect form web for “Android ScrollView può ospitare solo un figlio diretto”

    In realtà, non puoi 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 si dispone di un elemento extra fuori dalla tabella, esso si blocca con 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> 

    Speriamo questo aiuto.

    So che questa domanda è abbastanza vecchia, ma ho eseguito lo stesso problema e finisce per essere che non si può avere un ScrollView mentre si base vista per il layout.

    Basta avvolgere la Scrollview nel layout tracker.xml con un RelativeLayout e dovresti essere buono da percorrere

    Devi aggiungere LinearLayout in ScrollView, functionrà.

    Un'altra possibilità è che l'elemento di chiusura non corrisponda. Vale a dire.

     <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 si trova nell'ultima row.

    Um … non metti più viste all'interno di una vista di scorrimento. Inserisci una singola vista all'interno di esso che è il tipo di layout che desideri per le tue visualizzazioni multiple – TableLayout, FrameLayout, ecc.

    modifica (seconda risposta):

    Sto giocando con il codice e non sono ancora sicuro di perché questo accada, sicuramente c'è qualcosa di sbagliato nel gestore di frammenti quando si scambia i frammenti (sostituire (frammento, frammento))

    Nel mio frammento onCreateView è stato questo codice:

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

    post_fragment è una canvas vuota con 1 ScrollView, 1 LinearLayout dentro di esso e alcuni altri ViewGroups all'interno di esso. Questo è quello di caricare una canvas vuota sul primo carico (l'elemento è nullo) e la seconda volta, attraverso un input utente, avrebbe mostrato i dati reali.

    per qualche motivo oltre la mia conoscenza, come visto nel logcat, FragmentManagerImpl.moveToState stava chiamando ScrollView.AddChild che causava l'errore.

    Ora ho cambiato i miei frammenti suCreateView 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 la canvas 'vuota' sia un FrameLayout con niente su di esso e ora tutto funziona felicemente. Sono sicuro che questo suona come un errore strano sul frammento effettivo frammenti, ma è un lavoro intorno ad esso.

    1 risposta:

    Raptrex, per quanto posso vedere. Sì, quel layout della tabella è l'unico figlio che ha la tua scoperta. Sto esattamente lo stesso problema, e molto frustrato cercando di risolverlo.

    Dalla LogCat / Debug, sembra che ci sia qualcosa nel gestore Frames che sta chiamando e .AddView (visualizza) nel mio ScrollView (controlla il log) dipende da come cambiano il layout XML. Ottengo questo errore o no, che facciamo dire i suoni abbastanza assurdi!

    Qualche idea di come? Perché? Che 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) 

    Provare ad utilizzare un <FrameLayout> invece del <fragment> nel main.xml

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

    uso

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

    Ha risolto un problema simile con lo ScrollView, where ho sostituito il frammento dall'attività con:

     getSupportFragmentManager().beginTransaction() .replace(R.id.details_container, new DetailsFragment(), DETAILFRAGMENT_TAG) .commit(); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.