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是一体的
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 - 柱状波形图 wave view