Android设置Scrollview动态包装高度

时间:2015-10-13 00:55:50

标签: android android-layout android-scrollview

我在一个底部有描述元数据的视图中工作。当代码端出现案例时,尝试在内部显示额外的标题文本视图,因此可以显示或不显示此文本视图。但是,如果我这样做,我的线性布局(蓝色)中的高度将会增加,这实际上是我想要避免的。

如何在字幕文本视图出现之前保持线性布局的高度,因为所有高度都是WRAP_CONTENT?

这就是我的布局到目前为止的样子:

   <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/pp_white"
    android:orientation="vertical"
    android:padding="@dimen/margin_normal">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Title"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Desc 1"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="desc 2"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Desc 3"/>


    <TextView
        android:id="@+id/extra_caption"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Extra Caption"
        android:visibility="gone"/>
</LinearLayout>

我知道Scroll视图肯定是必需的,但是当额外的标题(文本视图)具有VISIBLE的可见性时我想使用滚动视图,否则我不想使用滚动视图。< / p>

到目前为止,我试图做到这一点没有成功:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/pp_white"
    android:orientation="vertical"
    android:padding="@dimen/margin_normal">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Title"/>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Desc 1"/>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="desc 2"/>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Desc 3"/>


            <TextView
                android:id="@+id/extra_caption"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Extra Caption"
                android:visibility="gone"/>
        </LinearLayout>
    </ScrollView>
</LinearLayout>

换句话说,我试图这样做:

enter image description here

1 个答案:

答案 0 :(得分:0)

走这条路,它奏效了! 关键是将一个Id设置为ScrollView,这样我就可以通过编程方式修改高度:

 <?xml version="1.0" encoding="utf-8"?>
        ...

        <ScrollView
            android:id="@+id/my_scroll_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

          ...
    </LinearLayout>

获取布局参数:

  private void displayExtraCaption() {
            extraCaptionTextView.setVisibility(View.GONE);
            int scrollHeightBeforeCaption = myScrollView.getHeight();
           ...
           }

这是另一个挑战,因为我在一个Lib内部实现了这个,所以我无法访问这些活动(Lib只有片段),所以我第一次#&# 39; m调用此方法scrollHeightBeforeCaption等于0,以避免在发生这种情况时设置Runnable:

 private void displayExtraCaption() {
            extraCaptionTextView.setVisibility(View.GONE);
            int scrollHeightBeforeCaption = myScrollView.getHeight();
            if (scrollHeightBeforeCaption == 0) {
                myScrollView
                        .post(new Runnable() {
                                  @Override
                                  public void run() {
                                      refreshMetaDataScrollViewHeight();
                                  }
                              }
                        );
            } else {
                refreshMetaDataScrollViewHeight();
            }
}

最后,我的refreshMetaDataScrollViewHeight()是在我的额外标题标签变为VISIBLE时将原始高度保留在ScrollView中的那个:

private void refreshMetaDataScrollViewHeight() {
    int scrollHeightBeforeCaption = metadataScrollView.getHeight();
    ViewGroup.LayoutParams myScrollViewParams = myScrollView.getLayoutParams();
    myScrollViewParams.height = scrollHeightBeforeCaption;
    myScrollView.setLayoutParams(myScrollViewParams);

    myScrollView.invalidate();
    extraCaptionTextView.setVisibility(View.VISIBLE);
    extraCaptionTextView.invalidate();
}

感谢您抽出时间阅读本文:)