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

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

XML(使用相对布局)

<View
    android:id="@+id/homeBackgroundTop"
    android:layout_width="0dp"
    android:layout_height="0dp"
    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 到底是什么?如果您有任何这些问题的链接,我们将不胜感激 :) 感谢您的帮助!

【问题讨论】:

    标签: android android-layout


    【解决方案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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-18
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        • 2010-11-02
        • 2022-01-10
        • 2014-12-21
        • 1970-01-01
        相关资源
        最近更新 更多