【问题标题】:Android margins not working when the view was added dynamically动态添加视图时Android边距不起作用
【发布时间】:2020-05-19 17:41:25
【问题描述】:

我正在向 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() 也可以,但是太慢了。

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

统一更新: 我尝试以编程方式重复该错误并使用以下代码得到它:

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

我希望应用边距,但事实并非如此。初始化此类视图的正确顺序是什么?

【问题讨论】:

  • AFAIK,不会编译。所有形式的addView() 都将View 作为参数,而parent.addView(params) 似乎没有传入View
  • 添加视图到父视图后设置边距。
  • 感谢通知,更改了 addView 参数。添加到父视图后我尝试设置参数,得到相同的结果

标签: android android-layout android-linearlayout layoutparams


【解决方案1】:

所以,我的麻烦在于当时没有初始化的 DP 到 PX 转换器。但是,为了澄清一切,我上面的示例只是一个错误(我在添加第二个 TextView 时没有将 params4 更改为 params5。 同样在测试所有内容时,我发现添加布局及其参数的顺序根本不重要。

【讨论】:

    【解决方案2】:

    您可能在 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);
            }
        };
    

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      试试这个:

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

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2017-07-03
        • 1970-01-01
        • 2012-07-30
        • 2014-01-25
        • 2020-01-29
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        相关资源
        最近更新 更多