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

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


当前回答

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

其他回答

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

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

layoutparams.setPadding(50,50,50,50);

ApplyPaddingTextView.setLayoutParams(layoutparams);

使用LinearLayout。LayoutParams或RelativeLayout。根据子视图的父布局的LayoutParams

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

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

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

它会帮你转换。

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

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

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

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