【问题标题】:Add padding on view programmatically以编程方式在视图上添加填充
【发布时间】:2012-03-29 22:47:44
【问题描述】:

我正在开发 Android v2.2 应用程序。

我有一个Fragment。在我的片段类的onCreateView(...) 回调中,我将布局膨胀到片段中,如下所示:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.login, null);
        
    return view;
}

上面膨胀的布局文件是(login.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Username" />

    
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Username" />

</LinearLayout>

我想为上面的&lt;LinearLayout&gt; 元素设置一个paddingTop,我想在Java 代码中而不是在xml 中进行。

如何在我的片段 Java 类代码中将paddingTop 设置为&lt;LinearLayout&gt; ??

【问题讨论】:

  • 您需要为您的 LinearLayout 分配一个 ID,以便您可以使用 findViewById 找到它,然后在其上调用 setPadding
  • @AleksG 通常是的,但考虑到 LinearLayout 是膨胀层次结构的根元素,这里没有必要。 view已经是LinearLayout了,这种情况下不用再找了。鉴于这是一个特殊的。
  • @alextsc:是的,同意。尽管如此,我仍然更喜欢将 ID 分配给我在应用程序中可能引用的任何内容。

标签: android android-layout android-emulator android-widget padding


【解决方案1】:

view.setPadding(0,padding,0,0);

这会将顶部填充设置为padding-像素。

如果您想将其设置为dp,则可以使用conversion

float scale = getResources().getDisplayMetrics().density;
int dpAsPixels = (int) (sizeInDp*scale + 0.5f);

【讨论】:

  • @Leem.fin 正如 Chris 所说,它是像素。如果你想要 dp,你必须手动进行转换:float scale = getResources().getDisplayMetrics().density;int size = (int) (sizeInPx*scale + 0.5f);
  • 0.5f 是从哪里来的?
  • @Georg 该代码取自这里:developer.android.com/guide/practices/… 0.5 用于在转换时获取最接近的整数(而不是使用 Math.round())
  • 我认为变量名应该是相反的:sizeInDp实际上是你在转换sizeInPx dps时得到的像素数。
【解决方案2】:

您可以在下面的代码中以编程方式为您的视图设置填充 -

view.setPadding(0,1,20,3);

而且,还有不同类型的填充可用 -

Padding

PaddingBottom

PaddingLeft

PaddingRight

PaddingTop

这些链接将指向 Android 开发者网站。希望这对你有很大帮助。

【讨论】:

【解决方案3】:

回答你的第二个问题:

view.setPadding(0,padding,0,0);

像 SpK 和 Jave 建议的那样,将以像素为单位设置填充。您可以通过计算 dp 值在 dp 中设置它,如下所示:

int paddingDp = 25;
float density = context.getResources().getDisplayMetrics().density
int paddingPixel = (int)(paddingDp * density);
view.setPadding(0,paddingPixel,0,0);

希望有帮助!

【讨论】:

  • 当然,这将按预期编译和工作,但为了清楚起见,您应该切换 int 变量的命名。因为您在 DP 中定义了填充并计算了给定设备的像素值。
  • 您正在将 dp 转换为像素。变量名称令人困惑。 "paddingPixel" 真正的意思是 dp
【解决方案4】:

如果您将填充存储在资源文件中,您可以简单地调用

int padding = getResources().getDimensionPixelOffset(R.dimen.padding);

它会为您完成转换。

【讨论】:

    【解决方案5】:

    编写以下代码来设置填充,它可能会帮助你。

    TextView ApplyPaddingTextView = (TextView)findViewById(R.id.textView1);
    final LayoutParams layoutparams = (RelativeLayout.LayoutParams) ApplyPaddingTextView.getLayoutParams();
    
    layoutparams.setPadding(50,50,50,50);
    
    ApplyPaddingTextView.setLayoutParams(layoutparams);
    

    根据子视图的父布局使用LinearLayout.LayoutParamsRelativeLayout.LayoutParams

    【讨论】:

    • setPadding() 不是 LayoutParams 的可访问方法。我不确定它是否曾经是。
    【解决方案6】:

    在以编程方式填充时,通过将像素转换为 Dp 来转换为与密度相关的值。

    【讨论】:

      【解决方案7】:

      与手动计算相比,使用TypedValue 是一种更简洁的像素转换方式:

      float paddingDp = 10f;
      // Convert to pixels
      int paddingPx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, paddingDp, context.getResources().getDisplayMetrics());
      view.setPadding(paddingPx, paddingPx, paddingPx, paddingPx);
      

      基本上,TypedValue.applyDimension 根据当前设备的显示属性将所需的填充适当地转换为像素。

      欲了解更多信息,请参阅:TypedValue.applyDimension Docs

      科特林;扩展功能

      fun Float.px(m: DisplayMetrics!): Int
          get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, m).toInt()
      
      ...
      val pad = 10.0f.px
      

      【讨论】:

      • px和dp不应该颠倒吗?
      • 我认为我正在做的事情的要点是正确的。但是我认为命名令人困惑。我将对其进行编辑以使其更清晰。感谢您的反馈。
      【解决方案8】:

      使用下面的方法动态设置填充

      setPadding(int left, int top, int right, int bottom)
      

      例子:

      view.setPadding(2,2,2,2);
      

      【讨论】:

        【解决方案9】:
        Context contect=MainActivity.this;
        TextView tview=new TextView(context);
        tview.setPaddingRelative(10,0,0,0);
        

        【讨论】:

        • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。
        【解决方案10】:

        使用 Kotlin 和 android-ktx 库,你可以简单地做到

        view.updatePadding(top = 42)
        

        See docs here

        【讨论】:

          【解决方案11】:

          最好的办法是不要自己写函数。

          让我解释一下动机 - 请查找官方 Android 源代码。

          TypedValue.java 我们有:

              public static int complexToDimensionPixelSize(int data,
                      DisplayMetrics metrics)
              {
                  final float value = complexToFloat(data);
                  final float f = applyDimension(
                          (data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK,
                          value,
                          metrics);
                  final int res = (int) ((f >= 0) ? (f + 0.5f) : (f - 0.5f));
                  if (res != 0) return res;
                  if (value == 0) return 0;
                  if (value > 0) return 1;
                  return -1;
              }
          

          和:

              public static float applyDimension(int unit, float value,
                                                 DisplayMetrics metrics)
              {
                  switch (unit) {
                  case COMPLEX_UNIT_PX:
                      return value;
                  case COMPLEX_UNIT_DIP:
                      return value * metrics.density;
                  case COMPLEX_UNIT_SP:
                      return value * metrics.scaledDensity;
                  case COMPLEX_UNIT_PT:
                      return value * metrics.xdpi * (1.0f/72);
                  case COMPLEX_UNIT_IN:
                      return value * metrics.xdpi;
                  case COMPLEX_UNIT_MM:
                      return value * metrics.xdpi * (1.0f/25.4f);
                  }
                  return 0;
              }
          

          如您所见,DisplayMetrics metrics 可能不同,这意味着它会产生不同的值跨 Android 操作系统驱动的设备。

          我强烈建议将您的 dp 填充放在 dimen xml 文件中,并使用官方 Android 转换,以便在 Android 框架的工作方式方面保持一致的行为。

          【讨论】:

          • 我想遵循这个解决方案,但是如果填充是来自 api 的常量怎么办?
          【解决方案12】:

          使用 Jave 的解决方案。

          public static int getResourceDimension(Context context, String name, String defType, String defPackage) {
                  int sizeInDp = 0;
                  int resourceId = context.getResources().getIdentifier(name, defType, defPackage);
                  if (resourceId > 0) {
                      sizeInDp = context.getResources().getDimensionPixelSize(resourceId);
                  }
                  float scale = context.getResources().getDisplayMetrics().density;
                  int dpAsPixels = (int) (sizeInDp*scale + 0.5f);
          
                  return dpAsPixels;
              }
          

          然后在需要时调用。

          int statusBarHeight = getResourceDimension(getContext(), "status_bar_height",
                          "dimen", "android");
                  statusBarHeight = (int) (statusBarHeight + getResources().getDimension(R.dimen.fragment_vertical_padding));
                  view.setPadding(0, statusBarHeight, 0, 0);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-24
            • 2012-05-26
            相关资源
            最近更新 更多