如何以编程方式覆盖XML高度属性?

时间:2015-11-04 04:34:39

标签: android android-layout

我有一个线性布局的活动。它有两个视图 - 一个按钮和一个自定义视图。我希望能够以编程方式设置自定义高度(它将在启动期间从绘制到其上的图像计算)。我希望它上面的按钮能够填满剩下的空间。怎么做到这一点? 到目前为止,我有这个XML代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="#0099cc"
              android:orientation="vertical"
              tools:context="eu.example.app.PianoActivity">

    <Button
        android:id="@+id/dummy_button"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="@string/dummy_button"/>

    <eu.example.app.PianoView
        android:id="@+id/pianoView"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:keepScreenOn="true"/>

</LinearLayout>

正如你所看到的,我在按钮上添加了1的重量和0dp的高度,因此它填充了剩余的空间。由于需要提供一些值,我给自定义View提供了固定的50dp。 现在我尝试使用以下代码更改高度:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(100, 100);
this.setLayoutParams(layoutParams);
this.requestLayout();

但无论我在哪里放置它 - 无论是在View的构造函数中还是在onDraw()方法中,它都没有做任何事情。

//编辑: 附加信息:自定义视图直接从View继承并仅覆盖onDraw()方法以在其自身上绘制一些内容。

3 个答案:

答案 0 :(得分:1)

你应该使用

public void onWindowFocusChanged(boolean hasFocus) {}

设置高度和宽度的方法。

答案 1 :(得分:0)

将xml中的线性布局的id属性设置为: -

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              droid:id="@+id/liLay"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="#0099cc"
              android:orientation="vertical"
              tools:context="eu.example.app.PianoActivity">
<Button ---/>
<eu.example.app.PianoView---/>
</LinearLayout>

现在在onCreate()方法中初始化布局,如下: -

LinearLayout liLay = (LinearLayout)findViewById(R.id.liLay);

现在按步骤设置布局参数

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(100, 100);
liLay.setLayoutParams(layoutParams);

这会对你有帮助。

答案 2 :(得分:0)

使用此:

initWithNavigationBarClass:toolbarClass: