我遇到了一个非常烦人的ScrollView调整大小的问题,而且我已经没有可能的解决方案了。
我有一个包含几个不同Fragment的FragmentPager,其中一个Fragment有一个ScrollView。带有ScrollView的Fragment由Spinner和包含其他View的LinearLayout(如SeekBar、Button、EditText等)的多行组成。根据Spinner中选择的选项,ScrollView会显示不同的视图。为此,某些视图的可见性会被设置为Gone,而其他视图则会被设置为Visible。这样做效果很好,但是事实上ScrollView在使用Spinner选择不同选项时似乎无法正确调整大小。
当ScrollView充满视图并且可以滚动时,如果用户选择一个显示少于填充ViewPort所需的View的选项,ScrollView仍然会滚动。当用户再次选择旧选项时,由于它采用了先前选项所需的大小,因此ScrollView现在无法滚动。然后,当用户再次选择相同的选项时,ScrollView突然变得可滚动,因为它现在已调整为实际所需的大小。
这里发生了什么?更好的方法是,我该如何解决这个烦人的问题?
我的布局:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/control_scroll"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#99000000"
android:fillViewport="true" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#DD000000"
android:gravity="bottom"
android:orientation="vertical" >
<TextView
android:id="@+id/lamp_choose_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="2dp"
android:paddingLeft="5dp"
android:text="@string/choose_lamp_text"
android:textColor="#FFFFFF"
android:textSize="14sp" />
</LinearLayout>
<Spinner
android:id="@+id/lamp_select_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:textColor="#FFFFFF" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#DD000000"
android:gravity="bottom"
android:orientation="vertical" >
<TextView
android:id="@+id/lamp_settings_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="2dp"
android:background="#44000000"
android:paddingLeft="5dp"
android:text="@string/lamp_settings_text"
android:textColor="#FFFFFF"
android:textSize="14sp" />
</LinearLayout>
<!-- Lamp name -->
<LinearLayout
android:id="@+id/naam_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="bottom"
android:paddingBottom="3dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="3dp" >
<TextView
android:id="@+id/bridge_naam"
style="@style/ConfigText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/config_lightname"
android:textColor="#FFFFFF"
android:textSize="16sp" />
<EditText
android:id="@+id/lamp_naam_input"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:background="@drawable/tasstextfield"
android:inputType="textNoSuggestions"
android:textColor="#FFFFFF" >
</EditText>
</LinearLayout>
<View
android:id="@+id/separator"
android:layout_width="fill_parent"
android:layout_height="0.5dp"
android:background="@android:color/black"
android:visibility="visible" />
<!-- Rest of the views -->
我已经尝试过的方法:
- 在父级ScrollView上使用ForceLayout/requestLayout
- 使ScrollView失效
- 在包含的LinearLayout上使用ForceLayout/requestLayout
- 使LinearLayout失效
- 使ScrollView的所有子元素失效
- 在ScrollView的所有子元素上使用ForceLayout/requestLayout
ListView
而不是构建自己的列表视图吗?忽略该页面上的Loader
示例--你可以简单地创建一个包含每个文本片段的String[]
或List<String>
,并将其提供给ArrayAdapter
,然后重写getView
来控制外观。 - quietmintScrollView
需要调整大小以适应新的视图。当设置内部视图为View.VISIBLE
时,请在父ScrollView
上调用requestLayout()
或forceLayout()
来安排布局过程。 - DeeVView.GONE
,而是根据需要添加/删除它们。这可能是最终强制调整大小的方法。虽然会增加一些额外开销,但并不比你已经尝试做的多。只需保留Views
的引用,就不必重新填充它们。只需将它们放入即可。 - DeeV