我有一组对象,其中包含当用户选择对象时可以在对话框中显示的信息。我的对话框的布局如下:
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"
>
<TableLayout
android:id="@+id/overlay_item_dialog_table"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:paddingLeft="10sp"
android:paddingRight="10sp"
>
<TableRow android:id="@+id/overlay_item_dialog_object_id_row"
android:visibility="gone">
<TextView
android:id="@+id/overlay_item_dialog_object_id_label"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/overlay_label_object_id"
android:textSize="12sp"
android:layout_gravity="right"/>
<TextView
android:id="@+id/overlay_item_dialog_object_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:paddingLeft="10sp"
android:layout_gravity="left"/>
</TableRow>
<TableRow android:id="@+id/overlay_item_dialog_latitude_row"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="@string/label_latitude"
android:layout_gravity="right"
/>
<TextView
android:id="@+id/overlay_item_dialog_latitude"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:paddingLeft="10sp"
android:layout_gravity="left"/>
</TableRow>
<TableRow android:id="@+id/overlay_item_dialog_longitude_row"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="@string/label_longitude"
android:layout_gravity="right" />
<TextView
android:id="@+id/overlay_item_dialog_longitude"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:paddingLeft="10sp"
android:layout_gravity="left"/>
</TableRow>
<TableRow android:id="@+id/overlay_item_dialog_date_row"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="@string/label_date"
android:layout_gravity="right" />
<TextView
android:id="@+id/overlay_item_dialog_date"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:paddingLeft="10sp"
android:layout_gravity="left"/>
</TableRow>
<TableRow android:id="@+id/overlay_item_dialog_time_row"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="@string/label_time"
android:layout_gravity="right" />
<TextView
android:id="@+id/overlay_item_dialog_time"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:paddingLeft="10sp"
android:layout_gravity="left"/>
</TableRow>
<TableRow android:id="@+id/overlay_item_dialog_direction_row"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/label_direction"
android:textSize="12sp"
android:layout_gravity="right"/>
<TextView
android:id="@+id/overlay_item_dialog_direction"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:paddingLeft="10sp"
android:layout_gravity="left"/>
</TableRow>
<TableRow android:id="@+id/overlay_item_dialog_speed_row"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/label_speed"
android:textSize="12sp"
android:layout_gravity="right"/>
<TextView
android:id="@+id/overlay_item_dialog_speed"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:paddingLeft="10sp"
android:layout_gravity="left"/>
</TableRow>
</TableLayout>
</ScrollView>
对话框本身是一个 android.support.v4.app.DialogFragment。对于布局中可见性设置为“已消失”的每一行,这些都是可选字段,我会执行以下操作以在必要时使它们可见(这在我的 onCreateDialog 方法中使用):
if ( position.hasSpeed() )
{
( (TableRow) rootView.findViewById( R.id.overlay_item_dialog_speed_row ) ).setVisibility( View.VISIBLE );
( (TextView) rootView.findViewById( R.id.overlay_item_dialog_speed ) ).setText( position.getSpeedString() );
}
这些是非常常见但可选的参数,我希望出现在其他所有参数之前,因此为什么要以这种方式处理它们。
其他参数处理如下,其中“layout”是一个名为“overlay_item_dialog_table”的TableLayout,取自调用getActivity().getLayoutInflater().inflate( R.layout.overlay_item_dialog, null ) 得到的根视图
for ( PositionParameter param : position.getPositionParameters().values() )
{
if ( param.getValue() != null && param.getValue().trim().length() != 0 )
{
TableRow tableRow = new TableRow( context );
TextView labelView = new TextView( context );
TextView valueView = new TextView( context );
TableRow.LayoutParams params = new TableRow.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT );
params.gravity = Gravity.RIGHT;
labelView.setLayoutParams( params );
labelView.setTextSize( 12 );
params = new TableRow.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT );
params.gravity = Gravity.LEFT;
valueView.setLayoutParams( params );
valueView.setPadding( 10, 0, 0, 0 );
valueView.setTextSize( 12 );
labelView.setText( param.getLabel() + ":" );
valueView.setText( param.getValue() );
tableRow.addView( labelView );
tableRow.addView( valueView );
layout.addView( tableRow );
}
}
在 Android 4.0 及更高版本上,这工作正常。我能够看到我期望的所有行。我的问题是,在 Android 2.2 和 2.3 上,我最终得到一个空对话框,但是对话框的大小似乎取决于对象中实际包含的数据,好像所有行都在那里,但设置为“不可见”而不是“消失”或“可见”。