改变View的高度和宽度Android的正确方法
Posted
技术标签:
【中文标题】改变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。
【讨论】:
以上是关于改变View的高度和宽度Android的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
Activity中获取view的高度和宽度为0的原因以及解决方案