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

Android 以编程方式在视图上添加填充,android,android-layout,android-emulator,android-widget,padding,Android,Android Layout,Android Emulator,Android Widget,Padding,我正在开发Android v2.2应用程序 我有一个片段。在我的fragment类的onCreateView(…)回调中,我对该片段展开了一个布局,如下所示: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.login, null);

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


我想为上面的
元素设置一个
paddingTop
,我想在Java代码中执行,而不是在xml中执行

如何在我的片段Java类代码中将
paddingTop
设置为

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

如果要改为在
dp
中进行设置,可以执行以下操作:


您可以在下面的代码中按专业语法设置视图的填充-

view.setPadding(0,1,20,3);
此外,还有不同类型的填充物可用-


这些链接将指向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.LayoutParams
RelativeLayout.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
根据当前设备的显示属性将所需的填充适当地转换为像素


有关更多信息,请参阅:。

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

setPadding(int left, int top, int right, int bottom)
例如:

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

使用Kotlin和android ktx库,您只需

view.updatePadding(top = 42)

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

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

TypedValue.java
中,我们有:

公共静态int complexToDimensionPixelSize(int数据,
显示度量(度量)
{
最终浮点数=复数浮点数(数据);
最终浮动f=应用尺寸(
(数据>>复杂单元移位)和复杂单元掩码,
价值
指标);
最终整数res=(整数)((f>=0)?(f+0.5f):(f-0.5f));
如果(res!=0)返回res;
如果(值==0)返回0;
如果(值>0)返回1;
返回-1;
}
以及:

公共静态浮点applyDimension(整数单位,浮点值,
显示度量(度量)
{
开关(单位){
案例综合单元PX:
返回值;
案例综合体单元倾角:
返回值*metrics.density;
案例综合单元SP:
返回值*metrics.scaledDensity;
案例综合单元
返回值*metrics.xdpi*(1.0f/72);
案例复杂单元单元:
返回值*metrics.xdpi;
案件复杂单位:
返回值*metrics.xdpi*(1.0f/25.4f);
}
返回0;
}
正如您所看到的,
DisplayMetrics
可以不同,这意味着跨Android操作系统驱动的设备将产生不同的值

我强烈建议将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);

您需要为LinearLayout分配一个ID,以便使用
findViewById
找到它,然后对其调用
setPadding
。@AleksG通常是的,但鉴于LinearLayout是膨胀层次结构的根元素,这里不需要它<代码>视图已经是线性布局,在这种情况下无需再次找到它。但这是一个特殊的例子。@alextsc:是的,我同意。尽管如此,我还是更愿意为我在应用程序中引用的任何东西分配ID。@Leem.fin正如Chris所说,它是像素。如果需要dp,则必须手动进行转换:
float scale=getResources().getDisplayMetrics().density
int size=(int)(sizeInPx*比例+0.5f)0.5f从何而来?@Georg该代码取自此处:0.5用于在强制转换时获取最接近的整数(而不是使用Math.round())我认为变量名应该是另一种方式:
sizeInDp
实际上是转换
sizeInPx
dps时得到的像素数。@Leem.fin您将能够知道差异。当然这将按照预期编译和工作,但为了清晰起见,您应该切换int变量的命名。因为您用DP定义了填充,并计算了给定设备的像素填充。您正在将DP转换为像素。变量名令人困惑。“paddingPixel”真的意味着dp,px和dp不应该颠倒吗?我认为我所做的要点是正确的。然而,我认为这个名字令人困惑。我会把它编辑得更清楚。感谢您的反馈。感谢您提供的这段代码片段,它可能会提供一些有限的、即时的帮助。通过展示为什么这是一个很好的问题解决方案,A将极大地提高它的长期价值,并将使它对未来有其他类似问题的读者更有用。请在回答中添加一些解释,包括您所做的假设。setPadding()不是LayoutParams中可访问的方法。我不确定它是否曾经是。我想遵循这个解决方案,但如果填充是一个常数,该怎么办
view.updatePadding(top = 42)
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);