android怎么改变view的高度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android怎么改变view的高度相关的知识,希望对你有一定的参考价值。

如题我重载了keyboardview想在它上面绘制一个候选栏,但是getheight不能重载怎么办
R.layout.input内容
<cn.elapser.elapserime.EKeyboardView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/keyboard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" />
创建EKeyboardView代码
mInputView = (EKeyboardView) getLayoutInflater().inflate(R.layout.input, null);
EKeyboardView继承自KeyboardView,目标是在KeyboardView正上方绘制一个View,并由EKeyboardView的方法来控制该View,并且要让系统认为这个View和KeyboardView是一体的

这样的思路不太对啊 ,如果需要再添加其他的view最好是把keyboardview和你说的候选栏放在一个layout如LinearLayout 或是RelativeLayout里,再去调整位置和高度等。
getHeight在绘制之前是只会返回0的。如果只是单纯需要重新定义view的高度,最好通过LayoutParams来改变里面的width 和height参数
LayoutParams lp = view.getLayoutParams();
lp.width = 110;
lp.height = 500;
view.setLayoutParams(lp);
view.invidate();追问

一调用getLayoutParams就崩溃
而且用于创建KeyboardView的layout也不知道能否指定RelativeLayout
具体情况可以看问题补充

追答

如果照你这么说的话,应该是在EKeyboardView里面去处理,你要怎么绘,都可以。但是布局方面就应该覆写onLayout()去排。

追问

多谢

参考技术A 先测量好,然后setMeasuredDimension(measuredHeight, measuredWidth);

int specMode = MeasureSpec.getMode(measureSpec);

int specSize = MeasureSpec.getSize(measureSpec);
依据specMode的值,(MeasureSpec有3种模式分别是UNSPECIFIED, EXACTLY和AT_MOST)
如果是AT_MOST,specSize 代表的是最大可获得的空间;
如果是EXACTLY,specSize 代表的是精确的尺寸;
如果是UNSPECIFIED,对于控件尺寸来说,没有任何参考意义。
参考技术B 属性可以设置的追问

怎么设置?

参考技术C 继承这个方法试试 onSizeChanged追问

-_-!

参考技术D 手机格式化,然后重新下载追问

你这么dio,你家里人知道吗?

追答

不会遗失信息的,我上次试了,先复制,再格式化

改变View的高度和宽度Android的正确方法

【中文标题】改变View的高度和宽度Android的正确方法【英文标题】:Correct way of changing View's Height and Width Android 【发布时间】:2016-06-23 20:19:25 【问题描述】:

这里对 android 非常陌生!我基本上对如何更改视图的高度和宽度感到困惑。目前我有这样的(sn-ps):

XML(使用相对布局)

<View
    android:id="@+id/homeBackgroundTop"
    android:layout_
    android:layout_
    android:layout_centerHorizontal="true"
    android:background="@color/colorAccent" />

Java

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int screenWidth = size.x;
    int screenHeight = size.y;

    final float pixelToDp = getResources().getDisplayMetrics().density;
    int screenHeightDp =  (int) (screenHeight * pixelToDp + 0.5f);
    int screenWidthDp =  (int) (screenWidth * pixelToDp + 0.5f);

    View view = findViewById(R.id.homeBackgroundTop);
    view.setLayoutParams(new RelativeLayout.LayoutParams(screenWidthDp, screenHeightDp));

    setContentView(R.layout.activity_main);

问题是它引发了以下致命错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setLayoutParams(android.view.ViewGroup$LayoutParams)' on a null object reference

现在我的问题是,如何以编程方式正确更改视图的高度和宽度?我查看了许多其他 SO 答案,但似乎没有一个对我有用。

P.S. RelativeLayout.LayoutParams 到底指的是什么?如果我想更改视图,为什么要调用布局?为什么有时还包含LinearLayout?最后,LayoutParams 到底是什么?如果您有任何这些问题的链接,我们将不胜感激 :) 感谢您的帮助!

【问题讨论】:

【参考方案1】:

在您致电 findViewById() 之前,尚未呼叫您的 setContentView(R.layout.activity_main);。因此找不到视图,因为您的视图尚未附加到您的活动中。

setContentView(R.layout.activity_main); 放在onCreate 的开头或至少在您调用findViewById() 之前。

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ...

编辑

回答您的附注RelativeLayout.LayoutParams 允许您设置视图对象的基本布局参数,例如高度和宽度。您的特定视图(按钮或 TextView 等)可能继承自 LinearLayout 或 RelativeLayout 视图。 LayoutParams 显然特定于不同的布局类型(相对与线性)。目前,我正在为自己寻找一个更具体的答案。如果您在上面找到任何东西,请告诉我。

【讨论】:

谢谢你,刚刚开始做你提到的事情,它正在工作! :) 谢谢你!! 哦,是的,那么RelativeLayout.LayoutParams 部分到底是什么?为什么要在其中添加 RelativeLayout 部分?我不是将参数添加到View 吗?为什么不是View.Params?知道的请详细说明! 编辑了我的答案,在你的问题上加了两分钱 好的,谢谢。我只是想知道,因为我专门为View 设置了高度和宽度,它位于RelativeLayout 的内部。因此,我不确定为什么要将参数设置为父级。如果我在这方面发现更多信息,我也会告诉你! :)【参考方案2】:

试试这个

    ViewGroup.LayoutParams params = view.getLayoutParams();
    params.height = screenHeightDp;
    params.width = screenWidthDp;
    view.setLayoutParams(params);

所以你的onCreate 方法将是这样的。

   @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        int screenWidth = size.x;
        int screenHeight = size.y;

        final float pixelToDp = getResources().getDisplayMetrics().density;
        int screenHeightDp =  (int) (screenHeight * pixelToDp + 0.5f);
        int screenWidthDp =  (int) (screenWidth * pixelToDp + 0.5f);

        View view = findViewById(R.id.homeBackgroundTop);
        ViewGroup.LayoutParams params = view.getLayoutParams();
        params.height = screenHeightDp;
        params.width = screenWidthDp;
        view.setLayoutParams(params);

    

这里要注意的一件事总是在调用super.Oncreate 之后调用 setContentView() 。

我已经测试过了。请让我知道它是否适合您

【讨论】:

【参考方案3】:

您正在尝试转换到错误状态为错误的 RelativeLayout。你需要另一种类型的演员表。

顺便说一句,setContentview 应该在超级参考下方。 这意味着您正在尝试使用 XML 中的 View 元素,而不是先调用 XML。

【讨论】:

以上是关于android怎么改变view的高度的主要内容,如果未能解决你的问题,请参考以下文章

android view怎么设置位置

android中怎么计算标题栏高度

在android中改变imageview的高度和宽度

Android 自定义View - 柱状波形图 wave view

Android 怎么将fragment 动态地添加到布局中的任意位置?

Android获取view高度