以编程方式创建0dp和布局权重1的textview

时间:2015-03-02 22:08:46

标签: android xml

我正在开发一个Android项目,我的布局有问题。

我所拥有的是JSONArray,我循环使用新的TableRow并在循环内围绕JSON数组中的另一个数组,用字段填充它。通过膨胀XML文件并将此视图添加到表行来填充字段。但是,目前没有任何内容出现在行中。

下面是我的TableRow xml文件

<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"/>

下面是我的TextView XML

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:textColor="@color/black"
    android:padding="5dp"/>

下面是我填充TableRow和TextView

的方法
for (int i = 0; i < result.length(); i++) {
    final TableRow tr = (TableRow) getLayoutInflater(getArguments()).inflate(R.layout.result_table_row_light_theme, resultTable, false);
    if (i == 0) {
        tr.setBackgroundColor(getResources().getColor(R.color.appPrimaryColour));
    } else if (i % 2 == 0) {
        if (settings.getInt(Defines.SharedPreferenceSettings.APPLICATION_THEME,
                com.BoardiesITSolutions.Library.R.style.LibAppTheme) == com.BoardiesITSolutions.Library.R.style.LibAppTheme) {
            tr.setBackgroundColor(getResources().getColor(R.color.resultRowLightThemeAlternateRow));
        }
    }
    JSONArray array = result.getJSONArray(i);
    for (int j = 0; j < array.length(); j++) {
        final TextView textView;
        textView = (TextView) getLayoutInflater(getArguments()).inflate(R.layout.result_textview, tr, false);
        textView.setText(array.getString(j));
        if (i == 0) {
            textView.setTypeface(null, Typeface.BOLD);
            textView.setGravity(Gravity.CENTER_HORIZONTAL);
        }
        getActivity().runOnUiThread(new Runnable() {

            @Override
            public void run() {
                tr.addView(textView);
            }
        });
    }
    getActivity().runOnUiThread(new Runnable() {

        @Override
        public void run() {
            resultTable.addView(tr);
        }
    });
}

如果我更改TextView XML文件以使layout_width为wrap_parent而不是0dp,则屏幕上会显示所有内容。

但是,当textview为0dp并且layout_weight为1时,则不显示任何内容,但是我希望每个文本视图均匀分布在屏幕的宽度上以填充空间。

我应该提到的是,不知道它是否有所作为,TableView是否在Horizo​​ntalScrollView中。如果数据小于屏幕,则行应该适合屏幕的宽度,但如果行不适合,则视图将水平滚动。

感谢您提供的任何帮助。

更新1

以下是承载TableLayout的XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <ScrollView 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scrollbars="horizontal">
        <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical">
            <HorizontalScrollView 
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">
                <TableLayout android:id="@+id/resultTable"
                    android:stretchColumns="*"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content">
                </TableLayout>
            </HorizontalScrollView>
        </LinearLayout>
    </ScrollView>
</RelativeLayout>

3 个答案:

答案 0 :(得分:1)

试试这个:

public void createTextView(Context context, LinearLayout parent) {
    final TextView v = new TextView(context);
    parent.addView(v); // Mandatory!
    v.post(new Runnable() { // In UI Thread. View Must be added to parent before getting layout params!
        @Override
        public void run() {

             // Get params:
             LinearLayout.LayoutParams lParams = (LinearLayout.LayoutParams) v.getLayoutParams();

             // Set only target params:
             lParams.width = 0;
             lParams.weight = 1;
             v.setLayoutParams(lParams);
        }
    });
}

答案 1 :(得分:1)

  

我应该提一下,不知道它是否有所作为,TableView是否在Horizo​​ntalScrollView中。

将滚动容器内的子视图告诉match_parent或以任何方式填充可用空间是一个逻辑错误。滚动容器(如ScrollViewHorizontalScrollView)将其唯一的子视图测量为UNSPECIFIED,以便子项可以在该方向上超出父级边界(因此,可滚动)。

滚动容器的孩子没有得到&#34;可用空间&#34;如果父级的维度没有明确定义,那么布局权重等操作就没有效果。

  

如果数据小于屏幕,则行应该适合屏幕的宽度,但如果行不合适,则视图将水平滚动。

您正在寻找的功能是fillViewportdocs link),它告诉滚动容器如果测量的宽度(在水平情况下)强制孩子匹配它的大小小于父母。用它来代替重量。

答案 2 :(得分:0)

你能尝试用XML进行布局(只是用虚拟数据调试它)吗?它是否按预期工作?

docs提到:

  

TableRow的子级不需要在XML文件中指定layout_width和layout_height属性。 TableRow始终将这些值分别强制为MATCH_PARENT和WRAP_CONTENT。

如果您尝试设置这些值,那么不确定这是否意味着它还会搞乱。正如您所发现的那样,如果设置它们,显然不仅仅是忽略它们。

另一部分说TableRow的父级应该是TableLayout - 是resultTable的类型(您提到TableView) - 否则它会表现出来作为水平方向的LinearLayout