【问题标题】:Evenly distribute textviews across linear layout horizontally and wrap content在线性布局中水平分布文本视图并包装内容
【发布时间】:2017-02-15 12:25:13
【问题描述】:

我想以编程方式在线性布局中添加一些文本视图。我希望这些文本视图均匀分布在线性布局的宽度上,并且我希望文本视图能够包装它们的内容。

我这样创建文本视图,但它们不包装内容。

    LinearLayout linearLayout = new LinearLayout(mContext);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    params.gravity = Gravity.BOTTOM;
    linearLayout.setOrientation(LinearLayout.HORIZONTAL);

    params.setMargins(40, 0, 0, 0);
    linearLayout.setLayoutParams(params);
   // linearLayout.setGravity(Gravity.BOTTOM);

    linearLayout.setOrientation(LinearLayout.HORIZONTAL);
    for(String label: labels) {
        TextView textView = new TextView(mContext);
        textView.setText(label.trim());
        textView.setTextSize(13);
        textView.setBackgroundColor(Color.GREEN);
        textView.setTextColor(R.color.labels_color);
        LinearLayout.LayoutParams mlp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1f);
        mlp.setMargins(0,0,20,0);

        textView.setLayoutParams(mlp);
        linearLayout.addView(textView);
    }
    chartWrapper.addView(linearLayout);

【问题讨论】:

  • 你成功了吗?

标签: android android-layout


【解决方案1】:

通过将权重分配给除最后一个之外的所有 TextViews 来修复它。

    public void drawLabels(List<String> labelsValues, ViewGroup container) {


    for (int i = 0; i < labelsValues.size(); i++) {
        String label = labelsValues.get(i);
        TextView textView = new TextView(mContext);
        textView.setText(label.trim());

        if (i == labelsValues.size() - 1) {
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            textView.setLayoutParams(params);
        } else {
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT, 1f);
            textView.setLayoutParams(params);
        }
        container.addView(textView);
    }
}

【讨论】:

    【解决方案2】:

    尝试代替

    LinearLayout.LayoutParams mlp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1f);
    

    使用零作为宽度:

    LinearLayout.LayoutParams mlp = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f);
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      我希望这些文本视图均匀分布在线性布局的宽度上,并且我希望文本视图包裹它们的内容

      您的目标是两种相互矛盾的设计,TextView 的宽度取决于其内容 (WRAP_CONTENT),或者是 LinearLayout 的宽度除以其中的 TextView 数量。

      如果你想要一个 TextView 来包装它的内容,那么就像你做的那样在 LayoutParams 中定义它。 如果你想将LinearLayout的宽度平均分,那么将TextView的gravity设置为1,将其宽度设置为0。

      顺便说一句,textView.setTextSize(13); 以像素为单位设置大小,不推荐使用,您应该使用 dp 或 sp。

      【讨论】:

        【解决方案4】:

        您应该在 LinearLayout 中使用 weightsum 和 weight 来均匀分布项目,并且据我所知,您只使用 weight。如果没有合适的 weightsum,linearlayout 将不知道如何分配。

        如果这不起作用,请尝试将宽度设置为 0,我认为它需要权重才能正常工作。但是你希望你的 textviews 有 wrap_content 所以也许你应该把 textview 放在一个布局中并给布局 0 宽度,这样你就可以让你的 textview wrap_content。

        【讨论】:

        • 他已经在使用权重 (new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1f);) - 1f 是权重值
        • @krossovochkin 感谢您指出这一点!我编辑了帖子。我实际上是指 weightsum 而不是重力。
        【解决方案5】:

        为每个项目添加边距不是一个好主意。它适用于少量项目,但如果您添加 10 个项目,这些边距会推动内容太多。

        我创建了一个使用 LinearLayout 和 ConstraintLayout 动态处理 textview(横向和纵向)的项目 https://github.com/SwordArtist/DynamicEvenSpreadingView

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-08-26
          • 1970-01-01
          • 1970-01-01
          • 2013-01-09
          • 2012-09-27
          • 2015-07-27
          • 1970-01-01
          相关资源
          最近更新 更多