【问题标题】:Android ScrollView can host only one direct childAndroid ScrollView 只能托管一个直接子级
【发布时间】:2011-09-25 14:18:49
【问题描述】:

我有一个来自画廊的 onclick 监听器,它应该清除 tableview 内的所有行,然后将行/行添加到滚动视图内的 tableview。每次单击按钮时,片段都会发生变化。

但是我得到:java.lang.IllegalStateException: ScrollView 只能托管一个直接子级。

我的活动按钮监听器

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

ma​​in.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>

有谁知道怎么回事?我猜我正在向滚动视图而不是表格视图添加一个表格行,但是,我没有看到我在代码中做错了什么。

【问题讨论】:

标签: android android-layout scrollview android-fragments


【解决方案1】:

事实上,你不能有这样的东西:

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

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    我知道这个问题已经很老了,但我遇到了同样的问题,最终你不能将ScrollView 作为布局的基本视图。

    只需使用 RelativeLayout 将 Scrollview 包装在您的 tracker.xml 布局中,您就可以开始使用了

    【讨论】:

      【解决方案3】:

      你应该将LinearLayout添加到ScrollView中,它会起作用。

      【讨论】:

        【解决方案4】:

        另一种可能是关闭元素不匹配。 IE。

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

        错误在最后一行。

        【讨论】:

          【解决方案5】:

          嗯...不要在滚动视图中放置多个视图。在其中放置一个视图,这是您想要的多个视图的布局类型 - TableLayout、FrameLayout 等。

          【讨论】:

          • 我的滚动视图中唯一的孩子不是tablelayout吗?
          • 如果发生异常,您将在滚动视图中获得多个视图。为什么?他在下面添加了一个例外。显然他正在将片段的视图层次结构添加到滚动视图中。
          【解决方案6】:

          编辑(第二个答案):

          我一直在玩代码,但我仍然不确定为什么会发生这种情况,片段管理器在交换片段时肯定有问题(替换(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 和一些其他的 ViewGroup。这是在第一次加载时加载一个空画布(项目为空),在第二次加载时,通过用户输入,它将获得要显示的实际数据。

          出于某种我不知道的原因,如 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,现在一切正常。 我敢肯定这在实际的 Fragments 框架中听起来像是一些奇怪的错误,但它是一种解决方法。

          第一个答案:

          Raptrex,据我所知。是的,该表格布局是您的 scrowview 拥有的唯一子项。我遇到了完全相同的问题,并且非常沮丧地试图解决它。

          从 LogCat/Debug 看来,片段管理器中似乎有一些东西正在调用,而 .AddView(view) 在我的 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)
          

          【讨论】:

          • “项目”是什么?在 onCreateView() 中初始化的某种变量?
          【解决方案7】:

          尝试在 ma​​in.xml

          中使用&lt;FrameLayout&gt; 而不是&lt;fragment&gt;

          所以不是

          <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 类似的问题,我将 Activity 中的片段替换为:

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

          【讨论】:

            【解决方案8】:

            上周我遇到了这个问题,然后找到了这个问题的最佳答案。

            Scrollview can host only one direct child

            【讨论】:

              猜你喜欢
              • 2013-06-08
              • 2013-05-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-04-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多