【问题标题】:Change linear layout top margin programmatically android以编程方式更改线性布局上边距android
【发布时间】:2013-06-14 15:32:37
【问题描述】:

我在一帧布局中有两个线性布局。

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

     <FrameLayout 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/image12">
        <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">   

                <LinearLayout
                    android:id="@+id/layoutbtnlinear_aboutme"
                    android:layout_width="fill_parent"
                    android:layout_height="55dp"
                    android:gravity="bottom"
                    android:layout_marginTop="10dp"
                     android:background="#b2b2b2" 
                    android:orientation="horizontal" >

                    <ImageView
                        android:id="@+id/imgShare_layout_aboutme"
                        android:layout_width="wrap_content"
                        android:layout_height="55dp"
                        android:layout_gravity="right|center|end"
                        android:layout_weight="1.63"
                        android:src="@drawable/ic_share" />

                    <TextView
                        android:id="@+id/txtTitle_layout_aboutme"
                        android:layout_width="wrap_content"
                        android:layout_height="55dp"
                        android:layout_gravity="left"
                        android:layout_weight="0.3"
                        android:fontFamily="Times New Roman"
                        android:text="About Me"
                        android:textColor="@android:color/black"
                        android:textSize="35sp"
                        android:textStyle="italic" />
                </LinearLayout>

            <LinearLayout
                android:id="@+id/content"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <ImageButton
                       android:id="@+id/btnSlidingDrawerHandler_layout_aboutme"
                       android:layout_width="wrap_content"
                       android:layout_height="wrap_content"
                       android:layout_gravity="center"
                       android:background="@drawable/ic_1_navigation_collapse" />


               <ListView
                    android:id="@+id/listView_layout_aboutme"
                    android:layout_width="fill_parent"
                    android:layout_height="match_parent"
                    android:footerDividersEnabled="true"
                    android:dividerHeight="4px"
                    android:isScrollContainer="true" 
                    android:scrollbarAlwaysDrawVerticalTrack="true" 
                    android:scrollbarStyle="outsideInset" 
                    android:scrollbars="vertical">
                </ListView>
            </LinearLayout>
        </LinearLayout>         
     </FrameLayout>  

</LinearLayout>

在这里,我将 ID 为 layoutbtnlinear_aboutme 的线性布局的 top margin 设置为 10dp,但在代码中我想在某些情况下将此 10dp 更改为 50dp 如何以编程方式更改此上边距?

【问题讨论】:

标签: android android-layout android-linearlayout


【解决方案1】:
   layout = (LinearLayout) findViewById(R.id.layoutbtnlinear_aboutme);
   LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)layout.getLayoutParams();
   params.setMargins(0, 50, 0, 0); 
   layout.setLayoutParams(params);

【讨论】:

  • setMargins 取这个参数 (left,top,right,bottom) ,如果有人想知道的话
【解决方案2】:

LayaoutParams 通常会因为其父布局而在设置边距时造成混乱......所以这个 MarginLayoutParams 非常有用,适用于所有布局。

Java 代码

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 200; //Ths value 200 is in px... Please convert in DP
params.leftMargin = 100; 
params.topMargin = 200;

Kotlin 代码

val params: MarginLayoutParams = view!!.layoutParams as MarginLayoutParams
params.width = 200 
params.leftMargin = 100 
params.topMargin = 200

【讨论】:

  • 这是最好的解决方案,因为它允许您正确设置各个边距。例如,如果您只需要设置 topMargin,只需使用 params.topMargin = yourValue。这样其他边距不会受到影响。如果您使用 Riser 的解决方案,则必须使用 setMargins() ,这需要您设置所有 4 个边距。
  • 您可能需要在更改这些值后调用view.invalidate()view.requestLayout()
  • view.layoutParams = params 这一行比较重要。
  • 非常重要的一点是,单位是在 PIXELS 中而不是在 DP 中。
  • 完美解决方案
【解决方案3】:

这会更新上边距而不需要更新其他边距值。

LinearLayout layout = (LinearLayout) findViewById(R.id.your_linear_layout);
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) layout.getLayoutParams();
layoutParams.topMargin = 200;
layout.setLayoutParams(layoutParams);

【讨论】:

    【解决方案4】:

    使用这个

        layout = (LinearLayout) findViewById(R.id.layuout);
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
             LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    
        layoutParams.setMargins(30, 20, 30, 0);
    layout.setLayoutParams(layoutParams );
    

    【讨论】:

    • 谢谢,但在这段代码中,我们将在哪里指定线性布局的 id。我们必须在哪个布局上设置边距
    【解决方案5】:

    使用该方法设置dp中的margin

    private void setMargins (View view, int left, int top, int right, int bottom) {
        if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
            ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
    
            final float scale = getBaseContext().getResources().getDisplayMetrics().density;
            // convert the DP into pixel
            int l =  (int)(left * scale + 0.5f);
            int r =  (int)(right * scale + 0.5f);
            int t =  (int)(top * scale + 0.5f);
            int b =  (int)(bottom * scale + 0.5f);
    
            p.setMargins(l, t, r, b);
            view.requestLayout();
        }
    }
    

    调用方法:

    setMargins(linearLayout,0,0,5,0);
    

    https://stackoverflow.com/a/50951911/8523391

    【讨论】:

      【解决方案6】:

      Kotlin 解决方案:

      fun LinearLayout.setMargins(left: Int? = null, top: Int? = null, right: Int? = null, bottom: Int? = null) {
          val params: LinearLayout.LayoutParams = this.layoutParams as LinearLayout.LayoutParams
      
          val left = left?.let { it } ?: params.leftMargin
          val top = top?.let { it } ?: params.topMargin
          val right = right?.let { it } ?: params.rightMargin
          val bottom = bottom?.let { it } ?: params.bottomMargin
      
          params.setMargins(left, top, right, bottom)
          this.requestLayout()
      }
      

      那么你只需要:

      layoutbtnlinear_aboutme.setMargins(top = 10)
      

      【讨论】:

        【解决方案7】:

        我已经使用下面的代码直接设置了边距(我尝试使用 LinearLayout.LayoutParams 但对我不起作用)

        LinearLayout layout = (LinearLayout)findViewById(R.id.yourrelative_layout);
        LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
        params.setMargins(3, 300, 3, 3); 
        layout.setLayoutParams(params);
        

        这里只是要注意应该为以下包android.widget.RelativeLayout.LayoutParams导入LayoutParams,除非你会遇到错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-09
          • 1970-01-01
          相关资源
          最近更新 更多