我正在Android Studio上制作一款游戏,但网格视图组件存在问题.我无法将网格视图中的项目居中对齐,如After image.我尝试了几种方式android:stretchMode,android:layout_centerHorizontal但它没有帮助.这是我的XML代码:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@android:color/holo_orange_light"
android:layout_weight="8"
android:layout_gravity="center">
<GridView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10px"
android:id="@+id/gridAnswersChar"
android:numColumns="8"
android:gravity="center">
</GridView>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
之前:
后:
Ben*_* P. 13
希望您使用的并不是对您的严格要求GridView,因为我相信您所寻找的内容基本上是不可能的.但是,如果您愿意使用RecyclerView,我会为您提供解决方案.
该解决方案将利用FlexboxLayoutManagerGoogle的FlexboxLayout项目的一部分:https://github.com/google/flexbox-layout
我的解决方案的完整代码可在此处查看:https: //gist.github.com/zizibaloob/0c44bfe59b371b5ae0bd2edcb4a7e592
我将在这里介绍重要的内容.首先,设置FlexboxLayoutManager在MainActivity.onCreate():
FlexboxLayoutManager manager = new FlexboxLayoutManager(this, FlexDirection.ROW);
manager.setJustifyContent(JustifyContent.CENTER);
RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler);
recycler.setLayoutManager(manager);
Run Code Online (Sandbox Code Playgroud)
当我们创建布局管理器时,我们传递FlexDirection.ROW告诉它我们希望它将我们的项目水平放置(即填充一行然后流到下一行,而不是填充一列然后流到下一列).
然后我们调用setJustifyContent()using JustifyContent.CENTER来告诉管理器我们希望部分填充的行居中.
第二个重要的部分是我们模仿其行为GridView及其具有一定数量列的能力的方式.此代码位于MyAdapter.onCreateViewHolder():
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) itemView.getLayoutParams();
layoutParams.width = (parent.getWidth() / 4) - layoutParams.leftMargin - layoutParams.rightMargin;
itemView.setLayoutParams(layoutParams);
Run Code Online (Sandbox Code Playgroud)
这里的关键是(parent.getWidth() / 4),每个项目查看可用宽度的四分之一.如果您想要不同数量的列,只需将其更改4为a 8等.
我们还从宽度中减去leftMargin,rightMargin因为我们的项目视图有边距,我们需要为它们留出空间.如果您的观点没有边距,则可以跳过此处.
把它们放在一起,你得到一个看起来像这样的应用程序:
| 归档时间: |
|
| 查看次数: |
2932 次 |
| 最近记录: |