动态添加视图时,Android边距不起作用

问题描述 投票:0回答:2

我正在将一些视图动态添加到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.recreate()也可以,但是太慢了。

如何强制布局重新计算边距?流程中可能有什么问题吗?我尝试在创建后将视图添加到根中,在应用属性之前和之后添加子级,但这对我不起作用。

UPD:我试图以编程方式重复该错误,并使用以下代码获取它:

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

Here's what I got

我希望应用边距,但不会。初始化这种视图的正确顺序是什么?

android android-layout android-linearlayout layoutparams
2个回答
1
投票
在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); } };


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.