XML(使用相对布局)
<View
android:id="@+id/homeBackgroundTop"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_centerHorizontal="true"
android:background="@color/colorAccent" />
爪哇
@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究竟是什么?如果您有任何这些问题的链接,我们将不胜感激:)感谢您的帮助!
答案 0 :(得分:1)
试试这个
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()。
我测试了这个。如果它适合您,请告诉我
答案 1 :(得分:1)
在致电setContentView(R.layout.activity_main);
之前,您的findViewById()
未被呼叫。因此,无法找到任何视图,因为您的视图尚未附加到您的活动中。
将setContentView(R.layout.activity_main);
放在onCreate的开头,或者至少在致电findViewById()
之前。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
}
修改强>
要回答 P.S。,RelativeLayout.LayoutParams
允许您设置视图对象的基本布局参数,如高度和宽度。您的特定视图(Button或TextView等)可能继承自LinearLayout或RelativeLayout视图。 LayoutParams显然特定于不同的布局类型(相对于线性)。我现在正在四处寻找一个更具体的答案。如果您发现任何内容,请告诉我。
答案 2 :(得分:0)
您正在尝试转换为RelativeLayout,错误表明它是错误的。你需要另一种铸造。
顺便说一下,setContentview应该在超级引用的正下方。 这意味着您正在尝试使用XML中的View元素,而不首先调用XML。