【问题标题】:GridLayout. How set space between columns?网格布局。如何设置列之间的空间?
【发布时间】:2018-06-03 20:14:47
【问题描述】:

Android Studio 3.1、Java 1.8、Gradle 4.1

我使用 GridLayout。 一切正常。 但我需要设置列之间的空间(例如 10dp)和行之间的空间。 我该怎么做?

ma​​in.xml

            <GridLayout
                android:id="@+id/categoriesContainer"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:verticalSpacing="10dp"
                app:layout_constraintEnd_toEndOf="@+id/birthDateContainer"
                app:layout_constraintStart_toStartOf="@+id/birthDateContainer"
                app:layout_constraintTop_toBottomOf="@+id/birthDateContainer">


            </GridLayout>

profile_category_active.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <android.support.constraint.ConstraintLayout
        android:id="@+id/profileCategoryContainer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">       


        <TextView
            android:id="@+id/categoryNameTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="5dp"
            android:layout_marginEnd="30dp"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="30dp"
            android:layout_marginStart="5dp"
            android:layout_marginTop="5dp"
            android:ellipsize="end"
            android:maxLines="1"
            android:text="TextView"                />
    </android.support.constraint.ConstraintLayout>
</layout>

活动:我以编程方式添加行:

 GridLayout gridLayout = findViewById(R.id.categoriesContainer);
    gridLayout.setColumnCount(columnCount);
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    for (int index = 0; index < 10; index++) {
     View profileCategoryActive = inflater.inflate(R.layout.profile_category_active, null, false);
            categoriesGridContainer.addView(profileCategoryActive);
            ConstraintLayout profileCategoryContainer = profileCategoryActive.findViewById(R.id.profileCategoryContainer);
            ViewGroup.LayoutParams profileCategoryContaineParams = profileCategoryContainer.getLayoutParams();
            profileCategoryContaineParams.width = (int) AndroidUtil.dpToPx(this, categoryItemWidth);
            profileCategoryContainer.setLayoutParams(profileCategoryContaineParams);
            TextView categoryNameTextView = profileCategoryActive.findViewById(R.id.categoryNameTextView);
            categoryNameTextView.setText("Ind " + profileCategoryContaineParams.width);
}

【问题讨论】:

标签: android android-gridlayout


【解决方案1】:

在xml GridLayout中,添加:

android:useDefaultMargins="true"

你会得到列和行之间的距离。

【讨论】:

  • 上安卓:useDefaultMargins="true"
  • 你能配置这个增加的距离吗?
  • 您无法配置此值。由平台设置。
【解决方案2】:

这就是我实现它的方法,希望这对某人有所帮助;

<GridLayout
    android:orientation="horizontal"
    android:columnCount="3"
    android:layout_marginEnd="-10dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:background="@color/colorBlack"
        android:textColor="@color/colorWhite"
        android:text="1"
        android:layout_marginEnd="10dp"
        android:layout_marginBottom="10dp"
        android:layout_columnWeight="1"
        android:layout_height="wrap_content"
        android:padding="15dp" />

    <TextView
        android:background="@color/colorBlack"
        android:textColor="@color/colorWhite"
        android:text="2"
        android:layout_marginEnd="10dp"
        android:layout_marginBottom="10dp"
        android:layout_columnWeight="1"
        android:layout_height="wrap_content"
        android:padding="15dp" />

    <TextView
        android:background="@color/colorBlack"
        android:textColor="@color/colorWhite"
        android:text="3"
        android:layout_marginEnd="10dp"
        android:layout_marginBottom="10dp"
        android:layout_columnWeight="1"
        android:layout_height="wrap_content"
        android:padding="15dp" />

    <TextView
        android:background="@color/colorBlack"
        android:textColor="@color/colorWhite"
        android:text="4"
        android:layout_marginEnd="10dp"
        android:layout_marginBottom="10dp"
        android:layout_columnWeight="1"
        android:layout_height="wrap_content"
        android:padding="15dp" />

</GridLayout>

基本上它所做的是在每个项目上设置一个边距 (10dp) 以将它们间隔在 GridLayout 内,然后它通过使用负边距 (-10dp) 来移动 GridLayout 以补偿额外的宽度。给出以下结果;

【讨论】:

    【解决方案3】:

    GridLayout 中的动态视图

    我遇到了一个稍微不同的问题。我需要在 GridLayout 中显示的视图无法提前确定(即无法在 XML 中创建它们)。我需要根据从数据库加载的信息以编程方式创建它们。

    for (socialPlatform in platformsWithNoAccount) {
        val socialIcon = ImageView(requireContext())
        socialIcon.setImageDrawable(ImageUtils.getSocialIcon(socialPlatform, false))        
        binding.addSocialLayout.addView(socialIcon)
        (socialIcon.layoutParams as? GridLayout.LayoutParams)?.marginEnd = 48
    }
    

    关键是最后一行:

    (socialIcon.layoutParams as? GridLayout.LayoutParams)?.marginEnd = 48
    

    在将视图添加到 GridLayout 之后,它应该有一个 GridLayout.LayoutParams 对象,您可以通过设置 marginStart、marginEnd 等在代码中进行更改。

    【讨论】:

      【解决方案4】:

      我找到了解决办法:

      1. 使用 android.support.v7.widget.GridLayout
      2. 此处以编程方式水平设置边距和全尺寸

      O 活动:

                  View profileCategoryActive = inflater.inflate(R.layout.profile_category_active, null, false);
                  categoriesGridContainer.addView(profileCategoryActive);
      
                  // set ndroid:layout_columnWeight="1" programatically
                  GridLayout.LayoutParams params = new GridLayout.LayoutParams(GridLayout.spec(
                          GridLayout.UNDEFINED, GridLayout.FILL, 1f),
                          GridLayout.spec(GridLayout.UNDEFINED, GridLayout.FILL, 1f));
      
                  params.width = (int) AndroidUtil.dpToPx(this, categoryItemWidth);
                  params.bottomMargin = (int) tilePreviewLeftRightMarginDp;
                  params.topMargin = (int) tilePreviewLeftRightMarginDp;
                  params.rightMargin = (int) tilePreviewLeftRightMarginDp;
                  params.leftMargin = (int) tilePreviewLeftRightMarginDp;
                  ConstraintLayout profileCategoryContainer = profileCategoryActive.findViewById(R.id.profileCategoryContainer);
                  profileCategoryContainer.setLayoutParams(params);
                  TextView categoryNameTextView = profileCategoryActive.findViewById(R.id.categoryNameTextView);
                  categoryNameTextView.setText("Ind " + params.width);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-16
        • 2020-10-07
        • 2020-08-17
        • 1970-01-01
        相关资源
        最近更新 更多