Intereting Posts
Что делать, если я хочу опубликовать обновление с более высоким значением minSDK, чем тот, который представлен на рынке? Android: задайте цвет программно из цветовых констант XML Добавление заголовка обратно в окно Android при использовании PhoneGap Активы Android без контекста Как получить фоновый рисунок из окна Activity? OpenGL и макеты Жизненный цикл приложения Android и singelton Как получить количество маркеров в видимой области на карте Структура ресурсов в Apache Cordova (PhoneGap) и загрузка файлов из файловой системы Идея 15 / Android Studio 1.4 зависает при синхронизации градиента для крупных проектов Фильтр шума данных акселерометра Как добавить второй раскрывающийся список в панель действий в Android Honeycomb? ProgressBar при загрузке ListView (с использованием AsyncTask) Получение и фильтрация данных GPS GPS, как улучшить информацию о местоположении Как я могу показать мягкую клавиатуру в веб-браузере с подключенным USB-HID-устройством при нажатии кнопки и фокусировкой ввода?

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