更改视图边距的程序化方法

3

我有一个RecyclerView,它的底部边距是250dp。我需要在程序中将底部边距设置为0dp,然后再将其设置回250dp。我尝试了这个方法,但只能将其设置为0dp,无法将其设置回250dp:

    ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) linearLayoutRv.getLayoutParams();
                params.setMargins(0,0,0,250); // params.setMargins(0,0,0,0); at first
                linearLayoutRv.setLayoutParams(params);

这里有一些不必要的东西,但是以下是xml文件:

    <androidx.constraintlayout.widget.ConstraintLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/linearLayoutRv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="250dp"
        android:gravity="center"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="51dp"
            android:gravity="center">
            //textview
          
        </androidx.constraintlayout.widget.ConstraintLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="51dp"
            android:orientation="horizontal">
            //some buttons
        </LinearLayout>

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginHorizontal="5dp"
            android:padding="4dp"
            android:scrollbars="vertical" />
    </LinearLayout>
4个回答

0

0

问题是setMargins接受的值不是以dp(密度无关像素)单位,而是以px(像素)单位。

在将其传递给params对象之前,您必须将值250转换为dp单位。

Context context = ...; // place 'this' if you are in an Activity or 'requireContext()' if you are in a Fragment
Resources res = context.getResources();
float dp250 = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 250, res.getDisplayMetrics());

ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) linearLayoutRv.getLayoutParams();
params.setMargins(0, 0, 0, dp250);
linearLayoutRv.setLayoutParams(params);

dp250在不同设备上会导致不同数量的像素。这取决于分辨率和物理屏幕尺寸。


0

当你以编程方式设置边距时,你设置的是像素值,而不是dp。LayoutParams的源代码:

         /**
         * Sets the margins, in pixels. A call to {@link android.view.View#requestLayout()} needs
         * to be done so that the new margins are taken into account. Left and right margins may be
         * overridden by {@link android.view.View#requestLayout()} depending on layout direction.
         * Margin values should be positive.
         *
         * @param left the left margin size
         * @param top the top margin size
         * @param right the right margin size
         * @param bottom the bottom margin size
         *
         * @attr ref android.R.styleable#ViewGroup_MarginLayout_layout_marginLeft
         * @attr ref android.R.styleable#ViewGroup_MarginLayout_layout_marginTop
         * @attr ref android.R.styleable#ViewGroup_MarginLayout_layout_marginRight
         * @attr ref android.R.styleable#ViewGroup_MarginLayout_layout_marginBottom
         */
        public void setMargins(int left, int top, int right, int bottom) {
            leftMargin = left;
            topMargin = top;
            rightMargin = right;
            bottomMargin = bottom;
            mMarginFlags &= ~LEFT_MARGIN_UNDEFINED_MASK;
            mMarginFlags &= ~RIGHT_MARGIN_UNDEFINED_MASK;
            if (isMarginRelative()) {
                mMarginFlags |= NEED_RESOLUTION_MASK;
            } else {
                mMarginFlags &= ~NEED_RESOLUTION_MASK;
            }
        }

你需要将你的dp转换为像素:
Int yourDP = 250
Resources r = getResources();
float px = TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP,
    yourDP,
    r.getDisplayMetrics()
);
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) linearLayoutRv.getLayoutParams();
            params.setMargins(0,0,0,(int) px); // params.setMargins(0,0,0,0); at first
            linearLayoutRv.setLayoutParams(params);

0

它之前是按像素工作的,所以我添加了这个方法:

public static int convertDpToPixel(int dp, Context context){
    return dp * ((int) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

并且更改了这个:

params.setMargins(0,0,0,convertDpToPixel(250,getContext()));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接