Android 嵌套线性布局不起作用

Android 嵌套线性布局不起作用,android,android-linearlayout,Android,Android Linearlayout,我已经尝试了两天来创建一个嵌套的线性布局(线性布局中的线性布局),但几乎没有成功。我的主布局有3个部分,权重分别为45、45和10。当我运行它时,它似乎工作得很好。我在屏幕上看到3个不同颜色的矩形 一旦我创建了“子”线性布局并将其添加到主控中,子布局将主导屏幕。次线性布局的权重为35、35和30。因此,我希望在屏幕上看到顶部矩形拆分为3个更薄的矩形。相反,我得到了属于子布局的3个矩形 有什么想法吗 创建时的公共void(Bundle savedInstanceState) { super.onC

我已经尝试了两天来创建一个嵌套的线性布局(线性布局中的线性布局),但几乎没有成功。我的主布局有3个部分,权重分别为45、45和10。当我运行它时,它似乎工作得很好。我在屏幕上看到3个不同颜色的矩形

一旦我创建了“子”线性布局并将其添加到主控中,子布局将主导屏幕。次线性布局的权重为35、35和30。因此,我希望在屏幕上看到顶部矩形拆分为3个更薄的矩形。相反,我得到了属于子布局的3个矩形

有什么想法吗

创建时的公共void(Bundle savedInstanceState) { super.onCreate(savedInstanceState)


布局权重属性仅在子布局参数设置为
wrap\u content
且其内部确实有额外空格时有用。

布局权重属性仅在子布局参数设置为
wrap\u content
且其内部确实有额外空格时有用。

第一件事是do在xml中,当用Java编写布局代码时,很难读取/维护布局代码(特别是在如此简单的情况下)。很少有理由在Java中编写这样的属性

其次,不要嵌套权重,这对性能有害: 您应该能够想出一个不需要嵌套布局的替代布局


第三,如果您绝对必须使用嵌套权重(同样,您几乎肯定不会),您需要设置sub1的权重。通过将其高度设置为填充父级,而不是将权重设置为0,您告诉它填充屏幕,因此它完全按照您所说的操作也就不足为奇了。

第一件事是在xml中执行此操作,很难读取/维护布局代码(特别是在如此简单的情况下)当它用Java编写时,很少有好的理由用Java编写这样的属性

其次,不要嵌套权重,这对性能有害: 您应该能够想出一个不需要嵌套布局的替代布局

第三,如果您绝对必须使用嵌套权重(同样,您几乎肯定不需要),则需要设置sub1的权重。通过将其高度设置为填充父级,而不是将权重设置为0,您告诉它填充屏幕,因此它完全按照您所说的做也就不足为奇了。

您需要: 1) 将要为其设置体重的儿童的身高设置为0。 2) 设置父布局的setweightSum(子布局的权重之和)。 将此代码作为我从您的代码示例中制作的示例进行检查:

 requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                             WindowManager.LayoutParams.FLAG_FULLSCREEN);

          TextView TextViewA = new TextView(this);
          TextView   TextViewB = new TextView(this);
          TextView      TextViewC = new TextView(this);

          TextView      TextViewD = new TextView(this);
          TextView      TextViewE = new TextView(this);
          TextView      TextViewF = new TextView(this);

         TextViewA.setBackgroundColor( Color.RED);
          TextViewB.setBackgroundColor( Color.BLACK);
          TextViewC.setBackgroundColor( Color.BLUE);
          TextViewD.setBackgroundColor( Color.CYAN);
          TextViewE.setBackgroundColor( Color.GRAY);
          TextViewF.setBackgroundColor( Color.GREEN);



       LinearLayout.LayoutParams paramsA = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, 0, .45f);
        LinearLayout.LayoutParams paramsB = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT,0, .45f);
        LinearLayout.LayoutParams paramsC = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,0, .10f);

        LinearLayout.LayoutParams paramsX = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, 0,.35f);
        LinearLayout.LayoutParams paramsY = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT,0, .35f);
        LinearLayout.LayoutParams paramsZ = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT,0, .30f);

        paramsA.setMargins(10, 10, 10, 10);
       paramsB.setMargins(10, 10, 10, 10);

      TextViewA.setLayoutParams(paramsA);
        TextViewB.setLayoutParams(paramsB);
        TextViewC.setLayoutParams(paramsC);
        TextViewD.setLayoutParams(paramsX);
        TextViewE.setLayoutParams(paramsY);
        TextViewF.setLayoutParams(paramsZ);

        LinearLayout sub1 = new LinearLayout(this);
        sub1.setOrientation(LinearLayout.VERTICAL);

        sub1.setLayoutParams(new LayoutParams( LayoutParams.FILL_PARENT,0,0.45f));
        sub1.setWeightSum(1f);
        sub1.addView(TextViewD);
        sub1.addView(TextViewE);
        sub1.addView(TextViewF);

        LinearLayout masterL = new LinearLayout(this);
        masterL.setOrientation(LinearLayout.VERTICAL);
        masterL.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
       masterL.setWeightSum(1f);
        masterL.addView(sub1);
        masterL.addView(TextViewB);
        masterL.addView(TextViewC);

        setContentView(masterL);
您需要: 1) 将要为其设置体重的儿童的身高设置为0。 2) 设置父布局的setweightSum(子布局的权重之和)。 将此代码作为我从您的代码示例中制作的示例进行检查:

 requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                             WindowManager.LayoutParams.FLAG_FULLSCREEN);

          TextView TextViewA = new TextView(this);
          TextView   TextViewB = new TextView(this);
          TextView      TextViewC = new TextView(this);

          TextView      TextViewD = new TextView(this);
          TextView      TextViewE = new TextView(this);
          TextView      TextViewF = new TextView(this);

         TextViewA.setBackgroundColor( Color.RED);
          TextViewB.setBackgroundColor( Color.BLACK);
          TextViewC.setBackgroundColor( Color.BLUE);
          TextViewD.setBackgroundColor( Color.CYAN);
          TextViewE.setBackgroundColor( Color.GRAY);
          TextViewF.setBackgroundColor( Color.GREEN);



       LinearLayout.LayoutParams paramsA = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, 0, .45f);
        LinearLayout.LayoutParams paramsB = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT,0, .45f);
        LinearLayout.LayoutParams paramsC = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,0, .10f);

        LinearLayout.LayoutParams paramsX = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, 0,.35f);
        LinearLayout.LayoutParams paramsY = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT,0, .35f);
        LinearLayout.LayoutParams paramsZ = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT,0, .30f);

        paramsA.setMargins(10, 10, 10, 10);
       paramsB.setMargins(10, 10, 10, 10);

      TextViewA.setLayoutParams(paramsA);
        TextViewB.setLayoutParams(paramsB);
        TextViewC.setLayoutParams(paramsC);
        TextViewD.setLayoutParams(paramsX);
        TextViewE.setLayoutParams(paramsY);
        TextViewF.setLayoutParams(paramsZ);

        LinearLayout sub1 = new LinearLayout(this);
        sub1.setOrientation(LinearLayout.VERTICAL);

        sub1.setLayoutParams(new LayoutParams( LayoutParams.FILL_PARENT,0,0.45f));
        sub1.setWeightSum(1f);
        sub1.addView(TextViewD);
        sub1.addView(TextViewE);
        sub1.addView(TextViewF);

        LinearLayout masterL = new LinearLayout(this);
        masterL.setOrientation(LinearLayout.VERTICAL);
        masterL.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
       masterL.setWeightSum(1f);
        masterL.addView(sub1);
        masterL.addView(TextViewB);
        masterL.addView(TextViewC);

        setContentView(masterL);

您的布局可以正常工作,但不是为您实际添加到
masterL
线性布局中的新子布局(
sub1
)添加
LayoutParams
),而是设置一组新的
LayoutParams
(将
width
height
设置为
FILL\u PARENT
?!!?)使
sub1
填充整个主布局。只需将正确的
LayoutParams
设置为
sub1

    sub1.setLayoutParams(paramsA);
注意:
正如其他人所说的嵌套权重对性能不太好,也许您可以使用其他类型的布局来改进布局。

您的布局可以很好地工作,但不是为新的子布局(
sub1
)添加
LayoutParams
paramsA
)您实际添加到
masterL
LinearLayout
中,您设置了一组新的
LayoutParams
(将
宽度和
高度设置为
填充父项
?)使您的
sub1
填充整个主布局。您所要做的就是将正确的
LayoutParams
设置为
sub1

    sub1.setLayoutParams(paramsA);
注意:
正如其他人所说的嵌套权重对性能不太好,也许你可以用其他类型的布局来改进你的布局。

TestView是你的定制线性布局吗?请分享一些描述你的目标布局的图片。你是否需要在运行时生成,你也可以生成XML,这将非常容易。它终于开始工作了ng-谢谢你的帮助。TestView是你自定义的线性布局吗?请分享一些描述你目标布局的图片。你是否需要在运行时生成,你也可以生成XML,这将更容易。它终于开始工作了-谢谢你的帮助。另外,使用XML将是一种更好的方式。@Jack:你可以投票并接受如果对你有效,答案就是正确的。另外,使用xml将是一种更好的方式。@Jack:如果对你有效,你可以投票并接受答案。非常感谢-它现在起作用了。一旦我读了你的评论,它就有意义了。我不确定为什么我以前不能理解。非常感谢-它现在起作用了。一旦我读了你的评论,它就有意义了。不I don’我不知道为什么我以前不能理解这个。