GridLayout中的TextView中的文本自动调整大小

时间:2018-11-01 02:00:38

标签: java android layout grid programmatically

我正在尝试以编程方式制作GridLayout。网格由显示标题的textView的交错行和显示数据的textView的行组成。

每个标题textView和第一行的第一个数据textView均设置为使用以下内容自动调整其文本大小:TextViewCompat.setAutoSizeTextTypeWithDefaults(textView, TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM);

我遇到的问题是第一行数据textViews的高度大于所有其他数据textView行。 从我所看到的情况中,发生这种情况的原因是,第一个启用了文本自动调整大小的textView,甚至使数据textView具有相同的权重。

我的问题是:有什么方法可以纠正此问题,同时仍然在第一个textview上启用自动调整大小?

澄清:这是我在StackOverflow中遇到的第一个问题,所以我希望它的结构还可以。

我附上我的代码,以便您可以检出:

public void crear_layout(int cant_datos){
    GridLayout gridLayout = mView.findViewById(R.id.grid);

    gridLayout.removeAllViews();

    int total = cant_datos * 2;
    int column = 3;
    int row = total / column;

    gridLayout.setColumnCount(column);
    gridLayout.setRowCount(row + 1);
    gridLayout.setOrientation(GridLayout.VERTICAL);

    //Logic for creating the rows and setting tags for each textview(id's)
    boolean va_titulo = true;
    int cant_tit_per_column = (total + column - 1) / (column * 2);
    for (int id_titulo, id_dato, i = 0, col = 0, cont_datos = 0 ; i < total; i++) {

        if (cont_datos == cant_tit_per_column){
            col++;
            cont_datos = 0;
        }

        id_titulo = column * cont_datos + col;
        id_dato = column * cont_datos + col;

        if(va_titulo && id_titulo < cant_datos) {
            add_view_title(gridLayout, id_titulo);
            va_titulo = false;
        }
        else if (id_dato < cant_datos){
            add_view_data(gridLayout, id_dato);
            va_titulo = true;
            cont_datos++;
        }
    }
}

private void add_view_title(GridLayout gridLayout, int id){
    AppCompatTextView textView = new AppCompatTextView(activity);

    textView.setGravity(Gravity.CENTER);
    textView.setMaxLines(1);
    //...Other customizations like custom background, tag(the purpose of int id) and font style...

    GridLayout.Spec rowSpan;
    GridLayout.Spec colspan;

    TextViewCompat.setAutoSizeTextTypeWithDefaults(textView, TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM);

    rowSpan = GridLayout.spec(GridLayout.UNDEFINED, 1,(float)0.2);
    colspan = GridLayout.spec(GridLayout.UNDEFINED, 1,1);
    GridLayout.LayoutParams textviewparams = new GridLayout.LayoutParams();
    textView.setLayoutParams(textviewparams);

    GridLayout.LayoutParams gridParam = new GridLayout.LayoutParams(rowSpan, colspan);

    gridLayout.addView(textView, gridParam);
}

private void add_view_data(GridLayout gridLayout, int id){

    AppCompatTextView textView = new AppCompatTextView(activity);

    textView.setGravity(Gravity.CENTER);
    textView.setMaxLines(1);
    //...Other customizations like custom background, tag(the purpose of int id) and font style...

    GridLayout.Spec rowSpan;
    GridLayout.Spec colspan;

    TextViewCompat.setAutoSizeTextTypeWithDefaults(textView, TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM);

    rowSpan = GridLayout.spec(GridLayout.UNDEFINED, 1,1);
    colspan = GridLayout.spec(GridLayout.UNDEFINED, 1,1);

    GridLayout.LayoutParams textviewparams = new GridLayout.LayoutParams();
    textView.setLayoutParams(textviewparams);

    GridLayout.LayoutParams gridParam = new GridLayout.LayoutParams(rowSpan, colspan);

    gridLayout.addView(textView, gridParam);
}

编辑: 通过使用嵌套的线性布局,我能够解决此问题。基本上,我为每一行制作了线性布局。然后,将这些布局放入垂直的线性布局中。

1 个答案:

答案 0 :(得分:0)

除了高度1以外,您必须设置所有约束 和 将textView的{​​{1}}设置为scrollEnabled

您可以参考this。最终,您的文本视图将根据其文本值自动调整大小。