我正在开发一个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是否在HorizontalScrollView中。如果数据小于屏幕,则行应该适合屏幕的宽度,但如果行不适合,则视图将水平滚动。
感谢您提供的任何帮助。
更新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>
答案 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是否在HorizontalScrollView中。
将滚动容器内的子视图告诉match_parent
或以任何方式填充可用空间是一个逻辑错误。滚动容器(如ScrollView
或HorizontalScrollView
)将其唯一的子视图测量为UNSPECIFIED
,以便子项可以在该方向上超出父级边界(因此,可滚动)。
滚动容器的孩子没有得到&#34;可用空间&#34;如果父级的维度没有明确定义,那么布局权重等操作就没有效果。
如果数据小于屏幕,则行应该适合屏幕的宽度,但如果行不合适,则视图将水平滚动。
您正在寻找的功能是fillViewport
(docs link),它告诉滚动容器如果测量的宽度(在水平情况下)强制孩子匹配它的大小小于父母。用它来代替重量。
答案 2 :(得分:0)
你能尝试用XML进行布局(只是用虚拟数据调试它)吗?它是否按预期工作?
docs提到:
TableRow的子级不需要在XML文件中指定layout_width和layout_height属性。 TableRow始终将这些值分别强制为MATCH_PARENT和WRAP_CONTENT。
如果您尝试设置这些值,那么不确定这是否意味着它还会搞乱。正如您所发现的那样,如果设置它们,显然不仅仅是忽略它们。
另一部分说TableRow
的父级应该是TableLayout
- 是resultTable
的类型(您提到TableView
) - 否则它会表现出来作为水平方向的LinearLayout
。