旋转设备时ScrollView中的java.lang.IllegalStateException

时间:2018-06-03 08:33:00

标签: java android scrollview spinner

我正在使用ScrollView,下面称为fragmentView,在其中托管自定义Fragment,它通常可以正常工作。但是,当我将设备旋转到横向模式并返回时,应用程序崩溃说

java.lang.IllegalStateException: ScrollView can host only one direct child

我在点击Spinner项目时添加Fragment:

fragmentView.removeAllViews();

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
ConfigureFragment fragment = new ConfigureFragment();
fragment.setReferences(MainActivity.this, (Controller) spinner.getSelectedItem());
fragmentTransaction.add(fragmentView.getId(), fragment, "");
fragmentTransaction.commit();

我使用removeAllViews确保在添加任何新内容之前ScrollView为空。这是我片段的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ConfigureFragment">

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:stretchColumns="0">

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <EditText
                android:id="@+id/editTextName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:ems="10"
                android:gravity="center"
                android:inputType="textPersonName"
                android:padding="10dp" />
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                android:text="@string/esp_channel" />
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <SeekBar
                android:id="@+id/seekBarRed"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:max="@integer/esp_value_max"
                android:progress="@integer/esp_value_min" />

            <EditText
                android:id="@+id/editTextRed"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:ems="10"
                android:inputType="number"
                android:padding="10dp" />

        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <SeekBar
                android:id="@+id/seekBarGreen"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:max="@integer/esp_value_max"
                android:progress="@integer/esp_value_min" />

            <EditText
                android:id="@+id/editTextGreen"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:ems="10"
                android:inputType="number"
                android:padding="10dp" />

        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <SeekBar
                android:id="@+id/seekBarBlue"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:max="@integer/esp_value_max"
                android:progress="@integer/esp_value_min" />

            <EditText
                android:id="@+id/editTextBlue"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:ems="10"
                android:inputType="number"
                android:padding="10dp" />

        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <Button
                android:id="@+id/buttonRefresh"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:text="@string/esp_retrieve" />
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:text="@string/esp_connection" />
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/textView3"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:gravity="fill_vertical"
                android:padding="10dp"
                android:text="@string/esp_ip" />

            <EditText
                android:id="@+id/editTextIP"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"
                android:inputType="date"
                android:padding="10dp" />
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/textView4"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:gravity="fill_vertical"
                android:padding="10dp"
                android:text="@string/esp_port" />

            <EditText
                android:id="@+id/editTextPort"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"
                android:inputType="number"
                android:padding="10dp" />

        </TableRow>

    </TableLayout>

</android.support.constraint.ConstraintLayout>

1 个答案:

答案 0 :(得分:0)

解决方案1 ​​

使用replace()代替add()将片段添加到容器

由于方向更改而重新启动Activity时,会创建一次Activity,但会创建两次ConfigureFragment。

原因是系统会在应用程序被杀死时系统自动恢复活动和碎片。场景发生在super.onCreate()中。因此,上面的添加片段代码将在恢复的片段顶部添加一个额外的片段,这将导致当前的情况。 ScrollView不能有多个孩子!

解决方案2

如果要在活动的onCreate()方法中添加片段,请检查savedInstanceState变量(Bundle对象)。重新创建活动时,它不为空,然后只添加您的片段

if (savedInstanceState == null) {
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    ConfigureFragment fragment = new ConfigureFragment();
    fragment.setReferences(MainActivity.this, (Controller) spinner.getSelectedItem());
    fragmentTransaction.add(fragmentView.getId(), fragment, "");
    fragmentTransaction.commit();
}