更正视图的高度和宽度Android

时间:2016-06-23 20:19:25

标签: android android-layout

这里的android非常新!我对如何更改视图的高度和宽度感到困惑。目前我有这样的(片段):

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究竟是什么?如果您有任何这些问题的链接,我们将不胜感激:)感谢您的帮助!

3 个答案:

答案 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。