Android ScrollView может содержать только один прямой дочерний

У меня есть прослушиватель onclick из галереи, который должен очистить все строки внутри tableview, а затем добавить строку / строки в tableview внутри scrollview. Фрагмент должен меняться при каждом нажатии кнопки.

Однако я получаю: java.lang.IllegalStateException: ScrollView может содержать только одного прямого дочернего элемента.

Прослушиватель кнопки myactivity

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(); 

Фрагмент трекера

 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> 

Кто-нибудь знает, что случилось? Я предполагаю, что я добавляю строку таблицы в scrollview, а не в tableview, однако я не вижу, где я делаю это неправильно в своем коде.

На самом деле вы не можете иметь такие вещи, как:

 <?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> 

Но если у вас есть дополнительный элемент за пределами таблицы, он разбивается с помощью java.lang.IllegalStateException: ScrollView can host only one direct child элемент

пример

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

Надеюсь, эта помощь.

Я знаю, что этот вопрос довольно старый, но я столкнулся с той же проблемой, и в конечном итоге вы не имеете ScrollView качестве базового представления для макета.

Просто оберните Scrollview в макете tracker.xml с помощью RelativeLayout и вам должно быть хорошо идти

Вы должны добавить LinearLayout в ScrollView, он будет работать.

Другая возможность заключается в том, что закрывающий элемент не соответствует. То есть.

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

Ошибка в последней строке.

Ум … не помещайте несколько просмотров внутри прокрутки. Поместите один вид внутри него, который является макетом, который вы хотите использовать для нескольких видов просмотров – TableLayout, FrameLayout и т. Д.

Edit (2-й ответ):

Я играю с кодом, и я все еще не уверен, ПОЧЕМУ это происходит, определенно что-то не так в диспетчере фрагментов, когда он обменивается фрагментами (replace (resId, фрагмент))

В моем фрагменте onCreateView был этот код:

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

Post_fragment – это пустой холст с 1 ScrollView, 1 LinearLayout внутри него и некоторые другие ViewGroups внутри него. Это нужно загрузить пустой холст на 1-й загрузке (элемент равен нулю), а во втором – через пользовательский ввод, он получит фактические данные для отображения.

По какой-то причине, не зависящей от моего знания, как показано в logcat, FragmentManagerImpl.moveToState вызывал ошибку ScrollView.AddChild.

Теперь я изменил свои фрагменты onCreateView на:

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

Так что «пустой» холст – это FrameLayout, на котором ничего нет, и теперь все работает счастливо. Я уверен, что это звучит как нечетная ошибка в реальной структуре фрагментов, но это работа вокруг нее.

1-й ответ:

Насколько я понимаю, Raptrex. Да, этот макет таблицы – единственный ребенок, который имеет ваш scrowview. У меня точно такая же проблема, и я очень расстроен, пытаясь ее решить.

Из LogCat / Debug кажется, что есть что-то в диспетчере фрагментов, который вызывает и .AddView (просмотр) в моем ScrollView (проверьте журнал), это зависит от того, как я изменяю свой XML-макет. Я получаю эту ошибку или нет, что давайте Звучит довольно абсурдно!

Любые идеи о том, как? Почему? Слушаю…

 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) 

Попробуйте использовать <FrameLayout> вместо <fragment> в вашем main.xml

Поэтому вместо

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

использование

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

Он решил аналогичную проблему с ScrollView, где я заменил фрагмент из действия:

 getSupportFragmentManager().beginTransaction() .replace(R.id.details_container, new DetailsFragment(), DETAILFRAGMENT_TAG) .commit(); 
Intereting Posts
Eclipse "Duplicate Location" при установке нового плагина Sequoyah? Зарегистрировать устройство на GCM каждый раз, когда начало приложения является правильным подходом? Компонент Dagger2 (un-scoped) не может зависеть от компонентов с областью – Ошибка Что я могу сделать, чтобы исправить ошибку исключения Null Pointer Android SDK? Почему Google Sign In In для Android возвращает «южный» идентификатор пользователя, который отличается от UserService.getCurrentUser () для учетных записей хостинга домена? Android: вернитесь к предыдущей деятельности Начать операцию только один раз Как включить вкладку «Изменения» Android Studio Галерея, как изображение с центральным увеличением изображения Альтернатива для TYPE_GAME_ROTATION_VECTOR Как «загрузить» Android Studio IDE без SDK? Картографическое изображение маркера Google Map с пикассо, обновите дважды, чтобы показать изображение Получение нулевого значения в MenuInflater Android с использованием последней версии SupportVersion OnLocationChanged () никогда не вызывал Ошибка отладчика Android (MonoDroid)