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

我正在开发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>

我想将paddingTop设置为上面的<LinearLayout>元素,并且我想在Java代码中执行,而不是在xml中执行。

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

326990 次浏览

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

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

如果你想在dp中设置它,你可以执行转换:

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

您可以设置填充到您的视图通过程序语法贯穿下面的代码-

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

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

< a href = " http://developer.android.com/reference/android/view/View.html attr_android % 3 apadding”>填充< / >

< a href = " http://developer.android.com/reference/android/view/View.html attr_android % 3 apaddingbottom”> PaddingBottom < / >

< a href = " http://developer.android.com/reference/android/view/View.html attr_android % 3 apaddingleft”> PaddingLeft < / >

< a href = " http://developer.android.com/reference/android/view/View.html attr_android % 3 apaddingright”> PaddingRight < / >

< a href = " http://developer.android.com/reference/android/view/View.html attr_android % 3 apaddingtop”> PaddingTop < / >

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

回答你的第二个问题:

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 padding = getResources().getDimensionPixelOffset(R.dimen.padding);

它会帮你转换。

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

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

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

与手动计算相比,使用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文档

芬兰湾的科特林;扩展函数

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


...
val pad = 10.0f.px

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

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

例子:

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

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

view.updatePadding(top = 42)

见docs here .

最好的方法是而不是自己写函数。

让我解释一下动机——请查阅官方的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-OS驱动的设备上产生__abc1。

我强烈建议把你的dp填充在dimen xml文件和使用官方的Android转换有一致的行为,关于Android框架的工作方式。

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

在这里你可以看到在哪个部分应用了填充

bidding.subHeader.tvSubHeader.setPadding(0, 5, 0, 0);

有人编辑了这个答案,但我添加了一张之前被删除的图像,这里又出现了

enter image description here

    binding.appBarMain.toolbar.setOnApplyWindowInsetsListener { _, insets ->
val statusBarSize: Int =
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) {
insets.getInsets(WindowInsets.Type.systemBars()).top
} else {
insets.systemWindowInsetTop
}
binding.appBarMain.appBarLayout.setPadding(0, statusBarSize, 0, 0)
return@setOnApplyWindowInsetsListener insets
}

步骤1:首先,将填充值作为一个整数。

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

int padding = 16;[使用任何方法]

然后将填充值分配给布局。

layout.setPadding(padding, padding, padding, padding);

布局。setPadding(padding_left, padding_top, padding_right, padding_bottom);

所有侧面不同的填充可以分配。layout.setPadding(16, 10, 8, 12);

对于删除填充(无填充),将填充值设置为0,

layout.setPadding(0, 0, 0, 0);