Android 动态添加视图时边距不起作用
Android margins not working when the view was added dynamically
我正在向 LinearLayout 动态添加一些视图:
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(100, 100, 100, 100);
view.setLayoutParams(params);
parent.addView(view);
但是,没有应用边距。以下:
view.invalidate();
view.requestLayout();
parent.invalidate();
parent.requestLayout();
没用。但是,如果我强制 activity 重新创建(例如,关闭并打开我的手机 phone),则会应用边距。调用 activity.recreate() 也可以,但是太慢了。
如何强制布局重新计算边距?大概是流程出了问题?我尝试在创建后将我的视图添加到根,在应用属性之前和之后添加子项,但这对我不起作用。
更新:
我尝试以编程方式重复该错误并使用以下代码得到它:
LinearLayout base = new LinearLayout(context);
LayoutParams params1 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
base.setLayoutParams(params1);
base.setBackgroundColor(Color.CYAN);
root.addView(base);
LinearLayout another1 = new LinearLayout(context);
LayoutParams params2 = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
another1.setLayoutParams(params2);
another1.setOrientation(LinearLayout.VERTICAL);
another1.setBackgroundColor(Color.BLUE);
base.addView(another1);
TextView tv1 = new TextView(context);
tv1.setText("SOME TEST TEXT 1");
tv1.setTextColor(Color.BLACK);
LayoutParams params4 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
params4.setMargins(100, 100, 100, 100);
tv1.setLayoutParams(params4);
another1.addView(tv1);
TextView tv2 = new TextView(context);
tv2.setText("SOME TEST TEXT 2");
tv2.setTextColor(Color.BLACK);
LayoutParams params5 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
params4.setMargins(100, 100, 100, 100);
tv2.setLayoutParams(params5);
another1.addView(tv2);
我希望应用边距,但它们没有。初始化这样一个视图的正确顺序是什么?
您可能在 onCreate() 中将子视图添加到父视图。
在onCreate()中,父视图没有实际大小。
如果您必须在 onCreate() 中执行此操作,请尝试以下代码。
final ViewTreeObserver observer = parent.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
LinearLayout.LayoutParams params = new
LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(100, 100, 100, 100);
TextView view = new TextView(context);
view.setLayoutParams(params);
parent.addView(view);
observer.removeOnGlobalLayoutListener(this);
}
};
希望对您有所帮助!
所以,我的问题出在 DP 到 PX 转换器上,当时它还没有初始化。但是,为了澄清一切,我上面的例子只是一个错误(我在添加第二个 TextView 时没有将 params4 更改为 params5。
此外,在测试所有内容时,我发现添加布局及其参数的顺序根本不重要。
试试这个:
LinearLayout ll = findViewById(R.id.linearLayout);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(30,20,30,0);
希望对您有所帮助!
我正在向 LinearLayout 动态添加一些视图:
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(100, 100, 100, 100);
view.setLayoutParams(params);
parent.addView(view);
但是,没有应用边距。以下:
view.invalidate();
view.requestLayout();
parent.invalidate();
parent.requestLayout();
没用。但是,如果我强制 activity 重新创建(例如,关闭并打开我的手机 phone),则会应用边距。调用 activity.recreate() 也可以,但是太慢了。
如何强制布局重新计算边距?大概是流程出了问题?我尝试在创建后将我的视图添加到根,在应用属性之前和之后添加子项,但这对我不起作用。
更新: 我尝试以编程方式重复该错误并使用以下代码得到它:
LinearLayout base = new LinearLayout(context);
LayoutParams params1 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
base.setLayoutParams(params1);
base.setBackgroundColor(Color.CYAN);
root.addView(base);
LinearLayout another1 = new LinearLayout(context);
LayoutParams params2 = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
another1.setLayoutParams(params2);
another1.setOrientation(LinearLayout.VERTICAL);
another1.setBackgroundColor(Color.BLUE);
base.addView(another1);
TextView tv1 = new TextView(context);
tv1.setText("SOME TEST TEXT 1");
tv1.setTextColor(Color.BLACK);
LayoutParams params4 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
params4.setMargins(100, 100, 100, 100);
tv1.setLayoutParams(params4);
another1.addView(tv1);
TextView tv2 = new TextView(context);
tv2.setText("SOME TEST TEXT 2");
tv2.setTextColor(Color.BLACK);
LayoutParams params5 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
params4.setMargins(100, 100, 100, 100);
tv2.setLayoutParams(params5);
another1.addView(tv2);
我希望应用边距,但它们没有。初始化这样一个视图的正确顺序是什么?
您可能在 onCreate() 中将子视图添加到父视图。
在onCreate()中,父视图没有实际大小。
如果您必须在 onCreate() 中执行此操作,请尝试以下代码。
final ViewTreeObserver observer = parent.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
LinearLayout.LayoutParams params = new
LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(100, 100, 100, 100);
TextView view = new TextView(context);
view.setLayoutParams(params);
parent.addView(view);
observer.removeOnGlobalLayoutListener(this);
}
};
希望对您有所帮助!
所以,我的问题出在 DP 到 PX 转换器上,当时它还没有初始化。但是,为了澄清一切,我上面的例子只是一个错误(我在添加第二个 TextView 时没有将 params4 更改为 params5。 此外,在测试所有内容时,我发现添加布局及其参数的顺序根本不重要。
试试这个:
LinearLayout ll = findViewById(R.id.linearLayout);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(30,20,30,0);
希望对您有所帮助!