对齐 Android GridLayout
Align Android GridLayout
我需要 GridLayout 像这样对齐视图(浅蓝色图标和文本是 GridLayout 中的视图):
但我的 GridLayout 对齐方式如下:
如果我设置 app:layout_columnWeight="1"
and app:layout_rowWeight="1"
,我的 GridLayout 对齐方式如下:
我的网格布局xml:
<android.support.v7.widget.GridLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="18dp"
app:columnCount="7">
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Trilha"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Mergulho"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Praia"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Festas"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Parque de Diversões"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Relaxar"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Esportes Radicais"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Acampamento"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Off Road"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Passeio de Barco"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Restaurantes"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Show / Festival"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword13"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Resort / SPA"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword14"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Locas Históricos"/>
</android.support.v7.widget.GridLayout>
以及 GridView 中的视图:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.motivapp.motivapp.customview.DefaultTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/keywordTextView"
android:textSize="18sp"
android:text="Keyword"
android:textColor="#839EC5"
android:layout_gravity="center_horizontal"/>
<ImageView
android:layout_width="130dp"
android:layout_height="130dp"
android:layout_gravity="center_horizontal"
android:src="@drawable/keyword_button"
android:id="@+id/keywordButton"/>
</LinearLayout>
这是一个自定义视图,但现在,它什么都不做,只显示一个自定义文本视图和一个图像视图...我对 GridLayout 做了什么,使其像第一张图片一样对齐?
更新:
我的问题快要解决了...我改了一些东西,现在只有一个视图没有对齐。
我把app:layout_columnWeight="1"
放在了gridlayout的所有view上,并且改变了自定义view布局的gravity和text width:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|center_horizontal">
<com.motivapp.motivapp.customview.DefaultTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/keywordTextView"
android:textSize="16sp"
android:text="Keyword"
android:textColor="#839EC5"
android:gravity="center"/>
<ImageView
android:layout_width="120dp"
android:layout_height="120dp"
android:src="@drawable/keyword_button"
android:id="@+id/keywordButton"/>
</LinearLayout>
如何使所有这些视图居中?如何防止当 textview 有大宽度和换行时,他强制 imageview 向下并且不居中对齐?
使用 RecyclerView 而不是 GridLayout 并将计数设置为 7。
在xml
中使用这个
<GridView
android:id="@+id/grid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:columnWidth="100dp"
android:gravity="center"
android:numColumns="auto_fit"
android:stretchMode="columnWidth" />
您可以像这样将 RecyclerView 与 GridLayoutManager 一起使用
GridLayoutManager mGridLayoutManager = new GridLayoutManager(context, 2, LinearLayoutManager.HORIZONTAL, false);
将布局管理器设置为适配器
mRecyclerView.setLayoutManager(mGridLayoutManager);
发生这种情况是因为 textview 的尺寸很长,这就是为什么它需要更多 space 所以请将宽度设置为 match_parent
textview 如果它不起作用而不是减小该文本大小。
您可以将自定义 GridView 与 android:numColumns="7"
结合使用,或者您可以将 RecyclerView 与具有 7 列的 GridLayoutManager 结合使用
您可以使用项目视图的自定义布局来定义文本和图像,如下所示:
<?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="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/txtGridItem"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/imgGridItem"
android:layout_width="match_parent"
android:layout_height="130dp" />
</LinearLayout>
这是一种方法。这假定您希望 GridView 在父级中居中。如果它需要相对于其他东西居中,你将不得不修改代码。
我所做的只是将 onLayout 和 "translate" 网格视图子类化到居中位置。
public class GridViewCentering extends GridView
{
public GridViewCentering (Context context, AttributeSet attrs)
{
super (context, attrs);
}
@Override
protected void onLayout (boolean changed, int l, int t, int r, int b)
{
super.onLayout (changed, l, t, r, b);
int parentW = ((ViewGroup)getParent ()).getMeasuredWidth();
int w = getWidth ();
int offset = (parentW - w) / 2;
setTranslationX (offset);
}
}
问题是当文本只有一行或两行时,视图的高度不同。
有多种可能的解决方案:
最好的可能是:
将 layout_gravity="bottom" 添加到 Gridlayout 内的每个项目。如果有一个视图有两条线,则其他视图的间距将添加到顶部,并且图像(圆圈)都处于相同的高度。
如果您希望所有行具有相同的高度,您可以将 android:minLines="2" 添加到所有的文本视图。但是对于短文本,这会在文本和图像之间放置一个间距。
我需要 GridLayout 像这样对齐视图(浅蓝色图标和文本是 GridLayout 中的视图):
但我的 GridLayout 对齐方式如下:
如果我设置 app:layout_columnWeight="1"
and app:layout_rowWeight="1"
,我的 GridLayout 对齐方式如下:
我的网格布局xml:
<android.support.v7.widget.GridLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="18dp"
app:columnCount="7">
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Trilha"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Mergulho"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Praia"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Festas"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Parque de Diversões"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Relaxar"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Esportes Radicais"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Acampamento"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Off Road"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Passeio de Barco"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Restaurantes"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Show / Festival"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword13"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Resort / SPA"/>
<com.motivapp.motivapp.customview.KeywordView
android:id="@+id/keyword14"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
keyword:text="Locas Históricos"/>
</android.support.v7.widget.GridLayout>
以及 GridView 中的视图:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.motivapp.motivapp.customview.DefaultTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/keywordTextView"
android:textSize="18sp"
android:text="Keyword"
android:textColor="#839EC5"
android:layout_gravity="center_horizontal"/>
<ImageView
android:layout_width="130dp"
android:layout_height="130dp"
android:layout_gravity="center_horizontal"
android:src="@drawable/keyword_button"
android:id="@+id/keywordButton"/>
</LinearLayout>
这是一个自定义视图,但现在,它什么都不做,只显示一个自定义文本视图和一个图像视图...我对 GridLayout 做了什么,使其像第一张图片一样对齐?
更新:
我的问题快要解决了...我改了一些东西,现在只有一个视图没有对齐。
我把app:layout_columnWeight="1"
放在了gridlayout的所有view上,并且改变了自定义view布局的gravity和text width:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|center_horizontal">
<com.motivapp.motivapp.customview.DefaultTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/keywordTextView"
android:textSize="16sp"
android:text="Keyword"
android:textColor="#839EC5"
android:gravity="center"/>
<ImageView
android:layout_width="120dp"
android:layout_height="120dp"
android:src="@drawable/keyword_button"
android:id="@+id/keywordButton"/>
</LinearLayout>
如何使所有这些视图居中?如何防止当 textview 有大宽度和换行时,他强制 imageview 向下并且不居中对齐?
使用 RecyclerView 而不是 GridLayout 并将计数设置为 7。
在xml
中使用这个<GridView
android:id="@+id/grid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:columnWidth="100dp"
android:gravity="center"
android:numColumns="auto_fit"
android:stretchMode="columnWidth" />
您可以像这样将 RecyclerView 与 GridLayoutManager 一起使用
GridLayoutManager mGridLayoutManager = new GridLayoutManager(context, 2, LinearLayoutManager.HORIZONTAL, false);
将布局管理器设置为适配器
mRecyclerView.setLayoutManager(mGridLayoutManager);
发生这种情况是因为 textview 的尺寸很长,这就是为什么它需要更多 space 所以请将宽度设置为 match_parent textview 如果它不起作用而不是减小该文本大小。
您可以将自定义 GridView 与 android:numColumns="7"
结合使用,或者您可以将 RecyclerView 与具有 7 列的 GridLayoutManager 结合使用
您可以使用项目视图的自定义布局来定义文本和图像,如下所示:
<?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="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/txtGridItem"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/imgGridItem"
android:layout_width="match_parent"
android:layout_height="130dp" />
</LinearLayout>
这是一种方法。这假定您希望 GridView 在父级中居中。如果它需要相对于其他东西居中,你将不得不修改代码。
我所做的只是将 onLayout 和 "translate" 网格视图子类化到居中位置。
public class GridViewCentering extends GridView
{
public GridViewCentering (Context context, AttributeSet attrs)
{
super (context, attrs);
}
@Override
protected void onLayout (boolean changed, int l, int t, int r, int b)
{
super.onLayout (changed, l, t, r, b);
int parentW = ((ViewGroup)getParent ()).getMeasuredWidth();
int w = getWidth ();
int offset = (parentW - w) / 2;
setTranslationX (offset);
}
}
问题是当文本只有一行或两行时,视图的高度不同。 有多种可能的解决方案:
最好的可能是: 将 layout_gravity="bottom" 添加到 Gridlayout 内的每个项目。如果有一个视图有两条线,则其他视图的间距将添加到顶部,并且图像(圆圈)都处于相同的高度。
如果您希望所有行具有相同的高度,您可以将 android:minLines="2" 添加到所有的文本视图。但是对于短文本,这会在文本和图像之间放置一个间距。