Android 以编程方式在视图上添加填充
我正在开发Android v2.2应用程序 我有一个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);
片段
。在我的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);