如何以编程方式(在不更改xml文件的情况下)在Android中居中GridLayout?

如何以编程方式(在不更改xml文件的情况下)在Android中居中GridLayout?,android,android-layout,android-gridlayout,Android,Android Layout,Android Gridlayout,要在xml文件中居中放置GridLayout,只需添加行 android:layout_centerHorizontal="true" 或 这也可以用于其他布局。同样,以编程方式居中(例如,RelativeLayout)也很简单:膨胀视图,创建一个新的RelativeLayout.LayoutParams,然后让它调用 addRule(RelativeLayout.CENTER) 在将其添加到视图之前。但与RelativeLayout不同的是,方法.addRule未根据定义GridLayou

要在xml文件中居中放置
GridLayout
,只需添加行

android:layout_centerHorizontal="true"

这也可以用于其他布局。同样,以编程方式居中(例如,
RelativeLayout
)也很简单:膨胀视图,创建一个新的
RelativeLayout.LayoutParams
,然后让它调用

addRule(RelativeLayout.CENTER)

在将其添加到视图之前。但与RelativeLayout不同的是,方法
.addRule
未根据定义
GridLayout.LayoutParams
。这应该怎么做?

嗨,我想这会满足你的要求:

yourLayout.setAlignmentMode(GridLayout.CENTER)

corsair992的评论帮助我理解了这个问题:父容器将其子视图居中,因此如果您的
GridLayout
包含在
RelativeLayout
中,则可以通过添加以下代码来解决此问题:

RelativeLayout.LayoutParams overviewParams =
                    new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
                            RelativeLayout.LayoutParams.WRAP_CONTENT);

RelativeLayout relatLayout = (RelativeLayout) rootView.findViewById(R.id.relatView); //change to the id of your RelativeLayout.

overviewParams.addRule(RelativeLayout.CENTER_HORIZONTAL); //or CENTER_VERTICAL, or CENTER_IN_PARENT, depending on what you want to do

gridLayout.setLayoutParams(overviewParams); //gridLayout being your GridLayout

这是假设父视图
RelativeLayout
仅包含一个子视图。

删除了我以前的注释。setAlignmentMode用于int,而不是GridLayout.Alignment,因此此方法不起作用。问题背后的前提是不正确的<代码>视图布局完全由其父级
视图组
容器根据其规格完成
LayoutParams
只是一个类,可以由
ViewGroup
子类扩展和定义,以包含其子类的布局提示。它还可以定义自定义XML属性,这些属性将从其子级解析以创建
LayoutParams
android:layout\u center*
属性由
RelativeLayout
定义,由其子级用作布局提示,并根据相关规则转换为
RelativeLayout.LayoutParams
。@corsair992我理解,可以理解的是,使自身居中的不是GridLayout本身,而是其父容器,因为GridLayout始终相对于自身居中。尽管如此,我可以在xml文件的GridLayout中插入行
android:layout\u centerHorizontal=“true”
,它可以实现我想要的功能,那么我如何能够以编程方式打开和关闭该行呢?正如我所说的,
android:layout\u centerHorizontal=“true”
仅转换为一个
RelativeLayout.LayoutParams
,带有一个为
视图设置的
RelativeLayout.CENTER\u水平
规则。正如我提到的,
视图的
LayoutParams
只是一个提示,提示它的父级如何进行布局,并且是根据父级指定的。@corsair992使用您的注释,我能够解决这个问题,下面是我的代码的答案。不过,我的回答假设包含RelativeLayout的视图只有一个子视图,即GridLayout。如果它包含多个子视图,如何更改解决方案,使其仅以GridLayout为中心而不以其他子视图为中心?就像您使用的XML布局属性一样,
LayoutParams
被分配给子视图,而不是父视图-父视图根据它来布局每个子视图。你的解决方案似乎适得其反,所以我不确定它是如何工作的。
RelativeLayout.LayoutParams overviewParams =
                    new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
                            RelativeLayout.LayoutParams.WRAP_CONTENT);

RelativeLayout relatLayout = (RelativeLayout) rootView.findViewById(R.id.relatView); //change to the id of your RelativeLayout.

overviewParams.addRule(RelativeLayout.CENTER_HORIZONTAL); //or CENTER_VERTICAL, or CENTER_IN_PARENT, depending on what you want to do

gridLayout.setLayoutParams(overviewParams); //gridLayout being your GridLayout