我有一组对象,其信息可以在用户选择对象时显示在对话框中。我的对话框的布局如下:
<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上,我最终得到一个空对话框,但是对话框的大小似乎取决于对象中实际存在的数据,就好像所有行都在那里,但设置为“隐形“而不是”消失“或”可见“。