我有这种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);
}
}
此代码创建了这个:
如果我取消注释TextView
和Button
上的引力(我不明白为什么我必须这样做,因为它不在XML),我明白了:
哪个更接近,但仍然没有垂直居中。
我的问题是:如何在代码中LinearLayout
中水平和垂直居中查看我的视图,以便它与XML正在进行的操作相匹配?我试图表明XML和代码正在做同样的事情,但显然他们并非如此。这两者之间的区别是什么?
答案 0 :(得分:1)
要复制给定的XML,您需要在setGravity(Gravity.CENTER)
上调用LinearLayout
,而不是摆弄单个孩子View
s'LayoutParams
。
对于LinearLayout
,其子项LayoutParams
上与LinearLayout
方向相同方向的重力会被忽略,因为LinearLayout
只是想要明显地堆叠它的孩子在给定的方向。也就是说,对于垂直方向LinearLayout
,Gravity.CENTER
固有的垂直居中没有效果,因此只有水平居中才会应用,而这些行是未注释的。
然而,LinearLayout
本身设定的重力是另一回事。尽管孩子们的个人重力被忽略了,LinearLayout
仍然会在孩子们布置时将自身的内部重力应用到孩子身上。这就是直接在LinearLayout
上设置重力的原因。
此外,您还可以省略LayoutParams
上设置的LinearLayout
。它会默认填充内容空间,而你设置的gravity
不会影响任何内容,因为它告诉LinearLayout
的父母如何布置LinearLayout
本身,与孩子无关。