我在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弹出问题和这件事?这两个问题真让我烦恼。)
答案 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时,该元素将完全从布局中移除,并且在您将其显示之前不会占用任何空间。
请告诉我这是否适合您。