无法动态设置RelativeLayout的高度

时间:2016-03-28 11:12:50

标签: android android-layout

我在Android中设置 RelativieLayout 的高度时遇到问题。我想更改RelativeLayout的高度以显示已在 .xml 文件中定义的 LinearLayout ,但将高度设置为 0 并且无法看到。以下是详细信息:

<RelativeLayout android:id="@+id/relative_layout"
                android:layout_width="fill_parent"
                android:layout_height="55dp"
                android:focusable="true"
                android:focusableInTouchMode="true">

    <!--Input Block-->
    <RelativeLayout android:id="@+id/input_block"
                  android:layout_width="fill_parent"
                  android:layout_height="55dp">

        <EditText android:id="@+id/edit_text"
                  android:layout_marginLeft="10dp"
                  android:layout_width="220dp"
                  android:layout_height="55dp"
                  android:gravity="center"
                  android:text="Please input here"/>

        <Button android:id="@+id/send_btn"
                android:layout_marginRight="10dp"
                android:layout_width="50dp"
                android:layout_height="30dp"
                android:text="Send"/>
    </RelativeLayout>  

    <!--File Block-->
    <LinearLayout android:id="@+id/file_block"
                  android:layout_below="@+id/input_block"
                  android:layout_width="fill_parent"
                  android:layout_height="0dp"
                  android:orientation="horizontal"
                  android:visibility="invisible">

        <ImageButton android:id="@+id/emoji_btn"
                     android:layout_marginLeft="5dp"
                     android:layout_width="30dp"
                     android:layout_height="30dp"
                     android:src="@drawable/emoji"
                     android:background="@drawable/imageBtn_style"/>

        <ImageButton android:id="@+id/image_btn"
                     android:layout_marginLeft="5dp"
                     android:layout_width="30dp"
                     android:layout_height="30dp"
                     android:src="@drawable/imageGallery"
                     android:background="@drawable/imageBtn_style"/>
    </LinearLayout>
</RelativeLayout>

嗯,总之,首先隐藏了 file_block ,我希望它会在 edit_ext <之后显示/ strong>专注。以下是核心代码:

private RelativeLayout inputBlockLayout;
private LinearLayout   fileBlockLayout;
private EditText       editText;    

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

inputBlockLayout = (RelativeLayout)findViewById(R.id.input_block);
fileBlockLayout  = (LinearLayout)findViewById(R.id.file_block);
editText         = (EditText)findViewById(R.id.edit_text);

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        //editText get the focus to show the fileBlock
        if(hasFocus){   
            RelativeLayout.LayoutParams relativeLayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, inputBlockLayout.getLayoutParams().height + 30);
            inptlockLayout.setLayoutParams(relativeLayoutParams);

            LinearLayout.LayoutParams linearLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 30);
            fileBlock.setLayoutParams(linearLayoutParams);

            fileBlock.setVisibility(View.VISIBLE);
        }
        else{
            //editText lose focus to do sth.
        }
    }
});

然而我收到错误:

java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams

我不知道问题出在哪里?或者是否有动态设置布局高度的好方法?

问题的新进展:

首先,感谢 @Sagar Nayak @Nanoc !我已经应用了 Sagar Nayak 解决原始错误的好方法并且可以显示 file_block ,但之后,有一个&#39;显示 file_block 后,最高父布局 RelativeLayout(我的帖子代码中的id relative_layout)意外更改。在我的真实项目文件中, relative_layout 已应用 layout_alignParentBottom =&#34; true&#34; ,并显示在 file_block之后的顶部 显示。

更多详情:

XML:

<RelativeLayout android:id="@+id/relative_layout"
                android:layout_width="fill_parent"
                android:layout_height="55dp"
                android:layout_alignParentBottom="true"
                android:focusable="true"
                android:focusableInTouchMode="true">

    <!--File Block-->
    <LinearLayout android:id="@+id/file_block"
                  android:layout_below="@+id/input_block"
                  android:layout_width="fill_parent"
                  android:layout_height="30dp"
                  android:orientation="horizontal">
    </LinearLayout>
</RelativeLayout>

的java:

fileBlockLayout.setVisibility(View.GONE);

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        //editText get the focus to show the fileBlock
        if(hasFocus){
            //inputBlock defined 55dp first, after show the fileBlock it should increase 30dp   
            RelativeLayout.LayoutParams relativeLayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 85);
            inputBlockLayout.setLayoutParams(relativeLayoutParams);

            fileBlockLayout.setVisibility(View.VISIBLE);
        }
    }
});

我想知道问题是由 inputBlock 的方法 setLayoutParams 引起的。有没有人有个好主意?

注意:

考虑到 softKeyBoard 的弹出窗口会导致同样的问题(应用属性 android:windowSoftInputMode =&#34; adjustPan | stateHidden&#34; AndroidManifest.xml 无效的活动中,所以我添加了一个按钮来显示 fileBlock ,放弃原始方法。

<!--Input Block-->
<RelativeLayout android:id="@+id/input_block"
                android:layout_width="fill_parent"
                android:layout_height="55dp">

    <ImageButton android:id="@+id/add_file_btn"
                 android:layout_marginLeft="10dp"
                 android:layout_width="50dp"
                 android:layout_height="50dp"
                 android:src="@drawable/add_file_btn"
                 android:layout_centerVertical="true">

    <EditText android:id="@+id/edit_text"
              android:layout_marginLeft="65dp"
              android:layout_width="165dp"
              android:layout_height="55dp"
              android:gravity="center"
              android:text="Please input here"/>

    <Button android:id="@+id/send_btn"
              android:layout_marginRight="10dp"
              android:layout_width="50dp"
              android:layout_height="30dp"
              android:text="Send"/>
</RelativeLayout>

这里是 .java

fileBlockLayout.setVisibility(View.GONE);
addFileBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        RelativeLayout.LayoutParams relativeLayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 85);
        inputBlockLayout.setLayoutParams(relativeLayoutParams);

        fileBlockLayout.setVisibility(View.VISIBLE);
    }
});

然而,仍有问题。 (有没有人有一个很好的方法来解决softKeyBoard弹出问题和这件事?这两个问题真让我烦恼。)

2 个答案:

答案 0 :(得分:1)

正如logcat错误所说,file_block在RelativeLayout中,所以你必须使用RelativeLayout.LayoutParams。

只需更改

即可
LinearLayout.LayoutParams linearLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 30);

RelativeLayout.LayoutParams linearLayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 30);

下次,LayoutParams将应用于父视图,因此如果您将视图放在LinearLayout中,则其params必须是LinearLayout.LayoutParams类型。

也许您需要调用requestLayout()才能使更改生效。

希望这有帮助。

答案 1 :(得分:1)

首先检查此行中的代码 -

  

inputBlockLayout =(RelativeLayout)findViewById(R.id.input_block);

inputBlockLayout是一个相对布局。 和input_block是线性布局。

更正此错误,让我知道您面临的下一个问题是什么。

主要问题

您面临的布局问题以及您正在应用的解决方案非常适用,但更好的方法是 -

  • 将file_block中linearlayout的高度设置为正常(您想要的)。

    <!--File Block-->
    <LinearLayout android:id="@+id/file_block"
              android:layout_below="@+id/input_block"
              android:layout_width="fill_parent"
              android:layout_height="30dp"
              android:orientation="horizontal"
              android:visibility="invisible">
     ... (this is your code as you posted)
    
  • 然后你在活动中改变它 -

    fileBlockLayout.setVisibility(View.GONE);
    
    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
    //editText get the focus to show the fileBlock
    if(hasFocus){  
             fileBlockLayout.setVisibility(View.VISIBLE);
       }
    }
    
    });
    

<强>解释

这种方法比您应用的方法更好,因为您在布局中为元素提供空间,但只是使其高度为0dp使其不可见。并且使可见性不可见也不会从布局中带走元素,它只是使它不可见但空间被元素占用。

当您将可见性设为GONE时,该元素将完全从布局中移除,并且在您将其显示之前不会占用任何空间。

请告诉我这是否适合您。