代码与xml中心视图

时间:2018-01-13 18:23:34

标签: android xml android-layout android-linearlayout

我有这种XML布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Happy Coding!"
        android:textSize="42sp" />

    <Button
        android:id="@+id/button_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click me!"
        android:textSize="24sp" />

</LinearLayout>

创造了这个:

我试图在代码中重新创建它。 注意:我知道建议使用XML。我正在尝试创建一个解释创建布局的各种方法的教程,我想在两者中创建完全相同的布局,以证明它是可能的。

以下是我使用的代码:

package io.happycoding.helloworldapp;

import android.app.Activity;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Gravity;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        layoutParams.gravity = Gravity.CENTER;
        LinearLayout linearLayout = new LinearLayout(this);
        linearLayout.setLayoutParams(layoutParams);
        linearLayout.setOrientation(LinearLayout.VERTICAL);

        LinearLayout.LayoutParams textViewParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        //textViewParams.gravity = Gravity.CENTER;
        TextView textView = new TextView(this);
        textView.setLayoutParams(textViewParams);
        textView.setText("Happy Coding!");
        textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 42);
        linearLayout.addView(textView);

        LinearLayout.LayoutParams buttonParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        //buttonParams.gravity = Gravity.CENTER;
        Button button = new Button(this);
        button.setLayoutParams(buttonParams);
        button.setText("Click me!");
        button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 24);
        linearLayout.addView(button);

        setContentView(linearLayout);
    }
}

此代码创建了这个:

如果我取消注释TextViewButton上的引力(我不明白为什么我必须这样做,因为它不在XML),我明白了:

哪个更接近,但仍然没有垂直居中。

我的问题是:如何在代码中LinearLayout中水平和垂直居中查看我的视图,以便它与XML正在进行的操作相匹配?我试图表明XML和代码正在做同样的事情,但显然他们并非如此。这两者之间的区别是什么?

1 个答案:

答案 0 :(得分:1)

要复制给定的XML,您需要在setGravity(Gravity.CENTER)上调用LinearLayout,而不是摆弄单个孩子View s'LayoutParams

对于LinearLayout,其子项LayoutParams上与LinearLayout方向相同方向的重力会被忽略,因为LinearLayout只是想要明显地堆叠它的孩子在给定的方向。也就是说,对于垂直方向LinearLayoutGravity.CENTER固有的垂直居中没有效果,因此只有水平居中才会应用,而这些行是未注释的。

然而,LinearLayout本身设定的重力是另一回事。尽管孩子们的个人重力被忽略了,LinearLayout仍然会在孩子们布置时将自身的内部重力应用到孩子身上。这就是直接在LinearLayout上设置重力的原因。

此外,您还可以省略LayoutParams上设置的LinearLayout。它会默认填充内容空间,而你设置的gravity不会影响任何内容,因为它告诉LinearLayout的父母如何布置LinearLayout本身,与孩子无关。