滚动型孩子的变化后不直接调整(ScrollView does not resize directly

2019-08-17 21:43发布

我碰到一个非常恼人的问题关于滚动型调整大小和我跑了可能的解决方案。

我有包含几个不同的片段,其中一个具有滚动型FragmentPager。 与滚动型的片段是由一个微调和含有的LinearLayout与其他视图的若干行(如SeekBars,按钮Edittexts)在它的滚动型的。 根据哪个选项是在微调选择,了滚动显示不同的看法。 要做到这一点,一些观点都有其知名度转身走了,而另一些则转向可见。 这只是一个事实,即滚动型似乎并不在选择使用微调不同的选项适当调整自身的伟大工程。

当滚动型是全景的,并且因此可滚动的,如果用户选择其示出了一个选项较少需要Viewsthan以填充视口的滚动型仍然滚动。 当用户再次选择旧的选项,滚动型是现在无法滚动,因为它承担了为以前的选项需要的尺寸。 当用户再次选择同样的选项,滚动型顿时是滚动的,因为它是现在调整到所需要的实际大小。

这里发生了什么? 更棒的是,我怎么能解决这个恼人的问题?

我的布局:

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

事情我已经尝试过:

  • ForceLayout / requestLayout父滚动型
  • 无效滚动型
  • ForceLayout / requestLayout上含有的LinearLayout
  • 无效的的LinearLayout
  • 无效的滚动型的所有儿童
  • ForceLayout / requestLayout上滚动型的所有儿童

Answer 1:

这可能不是最愉快的解决方案,但它可能工作。 使用处理器发布延迟的消息,刷新视图第二次,因为如果用户将其上的刷新按钮,点击后选择了相同的选项两次。

// 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();
    }
  }
}


Answer 2:

这种变化尝试

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



Answer 3:

我想这LinearLayout使用某种类型的缓存机制,以避免每次测量孩子的。 或者,也许我错了。

但是,您可以尝试使用RelativeLayout ,而不是一堆LinearLayout 。 这将解决你的问题,这也将是更有效的,因为嵌套ViewGroup s是不利于性能。



Answer 4:

您可以继续设置了滚动高度“WRAP_CONTENT”,这样即使孩子的看法改变了滚动可以调整到新的设置



文章来源: ScrollView does not resize directly after child changes