改变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的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

Android:当视图改变方向时切换高度和宽度

android 如何动态设置控件的宽度和高度

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

Activity中获取view的高度和宽度为0的原因以及解决方案

Android:获取View视图在屏幕绝对位置和坐标方法总结

android如何改变 宽度和高度