以编程方式在视图上添加填充


235

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

我有一个片段

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>

我想将a设置paddingTop为上述<LinearLayout>元素,我想在Java代码中进行操作,而不是在xml中进行操作。

如何设置paddingTop<LinearLayout>我的片段Java类代码?


2
您需要为您的LinearLayout分配一个ID,以便可以找到它,findViewById然后调用setPadding它。
Aleks G 2012年

@AleksG通常是的,但是考虑到LinearLayout是膨胀层次结构的根元素,因此在这里不是必需的。view已经是LinearLayout,在这种情况下无需再次找到它。鉴于这是一个特殊的。

1
@alextsc:是的,同意。尽管如此,我仍然更喜欢为应用程序中可能引用的任何内容分配ID。
Aleks G 2012年

Answers:


486

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

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

如果要设置它dp,可以进行转换

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

6
克里斯说,@ Leem.fin是像素。如果需要dp,则必须手动进行转换:float scale = getResources().getDisplayMetrics().density; int size = (int) (sizeInPx*scale + 0.5f);
Jave 2012年

7
0.5f来自哪里?
冯·伍斯特先生

11
@Georg该代码摘自这里:developer.android.com/guide/practices/…0.5用于在转换时获取最接近的整数(而不是使用Math.round())
Jave

我认为变量名应该相反:sizeInDp实际上是在转换sizeInPxdps 时获得的像素数。
Friederbluemle 2013年

99

要回答第二个问题:

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);

希望有帮助!


3
当然,这将按预期进行编译和运行,但是为了清楚起见,您应该切换int变量的命名。因为您在DP中定义填充,并计算此给定设备的填充像素数。
Glenn85

您正在将dp转换为像素。变量名称令人困惑。“ paddingPixel”的真正含义是dp
Jiejie Wang Wang




9

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文档


1
px和dp不应该反转吗?
chris838 '17

我认为我所做的要旨是正确的。但是,命名让我感到困惑。我将对其进行编辑以使其更加清晰。感谢您的反馈。
i2097i

7

使用以下方法动态设置填充

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

范例:

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

3

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

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中的可访问方法。我不确定是否曾经如此。
斯里拉姆

2
Context contect=MainActivity.this;
TextView tview=new TextView(context);
tview.setPaddingRelative(10,0,0,0);

4
感谢您提供此代码段,它可能会提供一些有限的即时帮助。通过说明为什么这是一个很好的解决方案,正确的解释将大大提高其长期价值,并且对于其他存在类似问题的读者来说,它将更加有用。请编辑您的答案以添加一些解释,包括您所做的假设。
摩羯座

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.