我遇到了一个关于ScrollView调整大小的非常烦人的问题,而且我的可能解决方案已经用完了。
我有一个包含几个不同片段的FragmentPager,其中一个片段有一个ScrollView。 带有ScrollView的Fragment由一个Spinner和一个包含LinearLayout的ScrollView组成,其中包含几行其他视图(如SeekBars,Buttons,Edittexts)。 根据Spinner中选择的选项,ScrollView会显示不同的视图。为此,一些视图的可见性变为Gone,而其他视图则变为Visible。 这很好用,除了ScrollView在使用Spinner选择不同选项时似乎没有正确调整大小的事实。
当ScrollView充满了视图,因此可滚动时,如果用户选择的选项显示填充ViewPort所需的Viewsthan较少,则ScrollView仍会滚动。 当用户再次选择旧选项时,ScrollView现在无法滚动,因为它采用了上一个选项所需的大小。 当用户再次选择SAME选项时,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 -->
我已经尝试过的事情:
答案 0 :(得分:4)
这可能不是最令人愉快的解决方案,但可能会有效。 使用处理程序发布延迟消息以再次刷新视图,就好像用户在单击刷新按钮后两次选择相同的选项一样。
// The code when the user wants to update the views
myButton.setOnClickListener(new OnClickListener{
@Override
public void onClick(View view) {
updateView();
Message m = Message.obtain();
m.what = UPDATE_TAG;
mHandler.sendMessageDelayed(msg, 200);
}
})
...
final int UPDATE_TAG = 1;
public void updateView() {
// Code where View.GONE and View.VISIBLE + invalidate is used.
}
Handler mHandler = new Handler {
@Override
public void handleMessage(Message input_msg) {
if(msg.what == UPDATE_TAG) {
updateView();
}
}
}
答案 1 :(得分:1)
尝试进行此更改
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/control_scroll"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#99000000"
android:fillViewport="true" >
退出android:layout_weight="1"
答案 2 :(得分:0)
我认为LinearLayout
使用某种缓存机制来避免每次都测量孩子。或许我错了。
但是,您可以尝试使用RelativeLayout
代替LinearLayout
一堆。这将解决您的问题,而且效率会更高,因为嵌套的ViewGroup
对性能不利。
答案 3 :(得分:0)
您可以继续将ScrollView高度设置为“wrap_content”,这样即使子视图更改,ScrollView也可以调整为新设置