我正在使用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>
答案 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();
}