【问题标题】:Centering views in code vs xml在代码与 xml 中居中视图
【发布时间】:2018-01-13 18:23:34
【问题描述】:

我有这个 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 和代码在做同样的事情,但显然它们不是。两者有什么区别?

【问题讨论】:

  • 要复制该 XML,您希望在 LinearLayout 上调用 setGravity(Gravity.CENTER),而不是摆弄个人 LayoutParams。您还可以省略您在LinearLayout 本身上设置的LayoutParams。默认情况下,它将填充内容空间。
  • @MikeM。谢谢回复。那确实奏效了。你介意解释一下原因吗?设置LayoutParams和直接设置有什么区别?如果您将此扩展为答案,我会投票并接受它。 :p 不管怎样,感谢您的宝贵时间,感激不尽。
  • 没问题。肯定的事。给我一点把东西放在一起。

标签: android xml android-layout android-linearlayout


【解决方案1】:

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

对于LinearLayout,其子代LayoutParams 上与LinearLayout 方向相同的重力将被忽略,因为LinearLayout 只想在给定方向上简单地堆叠其子代。也就是说,对于您的垂直方向的LinearLayoutGravity.CENTER 固有的垂直居中没有影响,因此当这些行未注释时,仅应用水平居中。

但是,LinearLayout 本身的重力设置是另一回事。尽管孩子们的个人重力被忽略了,LinearLayout 仍然会在孩子们被布置时将其自身的内部重力施加到孩子们身上。这就是为什么直接在LinearLayout 上设置重力会达到预期效果的原因。

此外,您还可以省略您在LinearLayout 上设置的LayoutParams。默认情况下它将填充内容空间,并且您设置的gravity 没有任何影响,因为它告诉LinearLayout 的父级如何布置LinearLayout 本身,与它的孩子。

【讨论】:

  • 好的酷,所以LayoutParams 告诉父布局做什么?谢谢!
  • 完全正确。我不确定要解释多少,因为您显然知道孩子们需要LinearLayout.LayoutParamsViewLayoutParams 需要是父 ViewGroup 的类型,因为它们是父的信息。这也意味着您当前在LinearLayout 上设置的LayoutParams 本身是错误的类型,因为它实际上被放在FrameLayout 中,但在这种特殊情况下不会导致崩溃。但是,在其他情况下,如果在 View 上,您的 LayoutParams 类型与父级的 LayoutParams 不兼容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多