如何在 android 中为主 ConstraintView 设置边距?

How to set margin to main ConstraintView in android?

我想以编程方式为我的主布局设置边距。我将布局参数用作以下代码。

val parMain = mainLayout?.layoutParams as ConstraintLayout.LayoutParams

但是我有一些错误,比如

android.view.ViewGroup$LayoutParams cannot be cast to androidx.constraintlayout.widget.ConstraintLayout$LayoutParams

如果我将代码更改为 Android 想要这样:

val parMain = mainLayout?.layoutParams as ViewGroup.LayoutParams

我的布局参数中没有设置边距函数。

那是我的 xml 代码。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/detail_feed_scrool_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/transparent"
    tools:context=".DetailActivity">

    <View
        android:id="@+id/shadow_view"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:background="#99000000"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/detail_feed_view_pager_activity"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
    </androidx.viewpager.widget.ViewPager>

    <FrameLayout
        android:id="@+id/detail_fragment_frame_layout"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/white"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
    </FrameLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

我如何设置保证金?

A Layout/View 的 LayoutParams 取决于它的父布局

例如:-

如果您尝试从具有 ID android:id="@+id/shadow_view"<View> 获取布局参数,那么 layoutParams 将是 ConstraintLayout.LayoutParams 类型。

为什么?因为 ConstraintLayout<View> 的父布局。现在 <ViewPager> 也是如此,它的直接父级也是 ConstraintLayout,所以相同 ConstraintLayout.LayoutParams

并且当您想在任何 View/Layout 上设置 layoutParams 时,始终寻找直接父布局并设置为与该父布局类型相同 layoutParams

现在回答你的问题

在您的情况下,您没有任何父布局,这就是您获得 ViewGroup.LayoutParams.

的原因

ViewGroup 是布局的父级 class,更像是一个通用的 class 而这个 class 没有边距。

对您来说最简单的解决方案就是将整个布局包裹在您想要的另一个布局中,这样您的 ConstraintLayout 就会有一个父级,而您的 LayoutParams 将是那种布局类型你曾经包装

类似这样

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/detail_feed_scrool_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorPrimary">

        <View
            android:id="@+id/shadow_view"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:background="#99000000"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <androidx.viewpager.widget.ViewPager
            android:id="@+id/detail_feed_view_pager_activity"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

        </androidx.viewpager.widget.ViewPager>

        <FrameLayout
            android:id="@+id/detail_fragment_frame_layout"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:background="@android:color/white"
            android:visibility="gone"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

        </FrameLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>

现在,当您尝试获取 LayoutParams 时,您将获取它们作为 LinearLayout 类型