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

时间:2012-03-13 14:08:55

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

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

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

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

12 个答案:

答案 0 :(得分:444)

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

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

如果您想在dp中进行设置,可以执行conversion

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

答案 1 :(得分:86)

回答你的第二个问题:

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

希望有所帮助!

答案 2 :(得分:81)

如果将填充存储在资源文件中,则只需调用

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

它为你做转换。

答案 3 :(得分:13)

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

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

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

Padding

PaddingBottom

PaddingLeft

PaddingRight

PaddingTop

这些链接将引用Android开发者网站。希望这对你有所帮助。

答案 4 :(得分:8)

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

答案 5 :(得分:5)

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

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

示例:

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

答案 6 :(得分:5)

使用Kotlin和android-ktx库,您可以轻松完成

view.updatePadding(top = 42)

See docs here

答案 7 :(得分:2)

编写以下代码来设置填充,它可能对您有帮助。

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

答案 8 :(得分:1)

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

让我解释一下动机 - 请查找官方 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 框架的工作方式方面保持一致的行为。

答案 9 :(得分:0)

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

答案 10 :(得分:0)

delete

答案 11 :(得分:0)

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