对话框在ICS设备上与旧版本设备上显示不同

3
当我在我的ICS设备上以横向模式显示对话框时,对话框的宽度与纵向模式下显示的宽度相同。
但是在运行Gingerbread的设备上,当对话框处于横向模式时,它会跨越整个屏幕而不是紧密排列。
他们是否改变了ICS中对话框的显示方式,使其不像第二张图片那样跨屏幕显示?如何让它回到像第二张图片那样显示,这样它就不会像第一张图片那样紧密排列?
此应用程序的目标API为2.2,因此我无法使用任何ICS API或其他内容。
编辑:
以下是我调用对话框的方式:
incDialog = new MessageDialog(this, R.style.FullHeightDialog);
incDialog.PopUpMessage(this, oMessage);

对话框在一个继承自对话框的单独类中。

这是实际显示对话框的PopUpMessage方法。

    public void PopUpMessage(final Context context, clsMessageRecord oMessage) {
    MainActivity.lastMessageClicked = oMessage;
    moCallingContext = context;
    moMessage = oMessage;
    MainActivity.miShownDialogType = DialogID;
    MainActivity.setShownMessage(moMessage);
    MainActivity.mbIntentWasShown = true;
    Log.i(className + "::PopUpMessage", "New Message Dialog Show....");

    if (oMessage != null) {

        if (oMessage.getIsStation() == true) {
            // Incident Message Dialog
            this.setContentView(R.layout.message_st);
            clsStatusRecord oStation = ControlService.DB.StatusList.GetMessageByECM2ID(oMessage.ECM2ID);

            if (oStation != null) {
                if (oStation.AllowMapping()) {
                    ImageButton cmdMapping = (ImageButton) this.findViewById(R.id.cmdMapping);
                    cmdMapping.setVisibility(ImageButton.VISIBLE);
                    cmdMapping.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View view) {
                            MainActivity.loaded = false;
                            HandleMapping();
                        }
                    });
                } else {
                    ImageButton cmdMapping = (ImageButton) this.findViewById(R.id.cmdMapping);
                    cmdMapping.setVisibility(ImageButton.GONE);
                }

                if (oStation.IsChief()) {
                    ImageButton cmdChief = (ImageButton) this.findViewById(R.id.cmdChiefList);
                    cmdChief.setVisibility(ImageButton.VISIBLE);
                    cmdChief.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View view) {
                            MainActivity.loaded = false;
                            handleResponders();
                        }
                    });
                } else {
                    ImageButton cmdChief = (ImageButton) this.findViewById(R.id.cmdChiefList);
                    cmdChief.setVisibility(ImageButton.GONE);
                }
            }

            mStationID = moMessage.ECM2ID;
            mMessageID = moMessage.MessageID;

            TextView txtHeader = (TextView) this.findViewById(R.id.txtDialogHeader);
            TextView txtTOC = (TextView) this.findViewById(R.id.txtDialogTOC);
            TextView txtMessage = (TextView) this.findViewById(R.id.lblMessage);

            txtHeader.setText(oMessage.ECM2Name);
            txtTOC.setText(oMessage.TOC);
            txtMessage.setText(oMessage.MessageText);

            if(oMessage.MessageText.toUpperCase().startsWith("UPDATE")) {

                ImageButton cmdResp = (ImageButton) this.findViewById(R.id.cmdResponding);
                cmdResp.setEnabled(false);
                cmdResp.setImageResource(R.drawable.responding_disabled);

                ImageButton cmdDecl = (ImageButton) this.findViewById(R.id.cmdDeclining);
                cmdDecl.setEnabled(false);
                cmdDecl.setImageResource(R.drawable.declining_disabled);

                ImageButton cmdChief = (ImageButton) this.findViewById(R.id.cmdChiefList);
                cmdChief.setEnabled(false);
                cmdChief.setImageResource(R.drawable.chief_disabled);
            }

            ImageView imgIcon = (ImageView) this.findViewById(R.id.imgIcon);

            switch (oMessage.State) {
            case etMSNewMessage:
                imgIcon.setBackgroundDrawable(context.getResources().getDrawable(imgSTNew));
                break;

            case etMSResponded:
                imgIcon.setBackgroundDrawable(context.getResources().getDrawable(imgSTResponded));
                break;

            case etMSDeclined:
                imgIcon.setBackgroundDrawable(context.getResources().getDrawable(imgSTUnavailable));
                break;
            }

            Button cmdExit = (Button) this.findViewById(R.id.cmdExit);
            cmdExit.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    MainActivity.messageShown=false;
                    ClosePopup();
                }
            });

            ImageButton cmdDeclining = (ImageButton) this.findViewById(R.id.cmdDeclining);
            cmdDeclining.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    HandleDeclining(context);
                }
            });

            ImageButton cmdResponding = (ImageButton) this.findViewById(R.id.cmdResponding);
            cmdResponding.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    HandleResponding(context);
                }
            });

            Log.e(className + "::PopUpMessage", "Message View Shown (Incident)");
            this.show();
        } else {

            // Distribution List Dialog
            this.setContentView(R.layout.message_dl);

            Log.e(className + "::PopUpMessage", "Message Content Filling (Dist)");
            TextView txtHeader = (TextView) this.findViewById(R.id.txtDialogHeader);
            TextView txtTOC = (TextView) this.findViewById(R.id.txtDialogTOC);
            TextView txtMessage = (TextView) this.findViewById(R.id.lblMessage);

            txtHeader.setText(oMessage.ECM2Name);
            txtTOC.setText(oMessage.TOC);
            txtMessage.setText(oMessage.MessageText);

            ImageView imgIcon = (ImageView) this.findViewById(R.id.imgIcon);
            imgIcon.setBackgroundDrawable(context.getResources().getDrawable(imgDLRead));

            Button cmdExit = (Button) this.findViewById(R.id.cmdExit);
            cmdExit.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    MainActivity.messageShown=false;
                    MainActivity.disMessageShown=false;
                    HandleCancel();
                    messageType = false;
                }
            });

            ImageButton cmdReplyToSender = (ImageButton) this.findViewById(R.id.cmdReplyToSender);
            cmdReplyToSender.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    HandleReplyToSender();
                }
            });

            clsStatusRecord oRec = oMessage.GetStatusRecord();

            if (oRec != null) {
                ImageButton cmdReplyToDL = (ImageButton) this.findViewById(R.id.cmdReplyToDL);
                if (oRec.AllowWrite()) {
//                      ImageButton cmdReplyToDL = (ImageButton) this.findViewById(R.id.cmdReplyToDL);
                    cmdReplyToDL.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {
                            HandleReplyToDL();
                        }
                    });
                }else{
                    cmdReplyToDL.setEnabled(false);
                    cmdReplyToDL.setImageResource(R.drawable.replytodistlist_up_disabled);
                }
            }
            Log.e(className + "::PopUpMessage", "Message View Shown (Dist)");
            messageType = true;
            this.show();
        }
    } else {
    }
}

这是XML布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_root"              
android:orientation="vertical"
android:layout_height="match_parent"
android:padding="2dip" android:paddingTop="2dip" android:layout_width="fill_parent">

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_height="match_parent"
    android:padding="0dip" android:layout_width="fill_parent">

    <RelativeLayout
        android:id="@+id/contentLayout2" 
        android:orientation="vertical" 
        android:padding="0dip" 
        android:layout_height="wrap_content"
        android:layout_gravity="top|left"
        android:background="#000000"
        android:layout_weight="0" android:layout_width="fill_parent">   

        <ImageView 
            android:id="@+id/imgIcon" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content"
            android:layout_gravity="top|left" android:contentDescription="@string/desc">
        </ImageView>

        <TextView 
            android:layout_height="wrap_content" 
            android:text="" 
            android:id="@+id/txtDialogHeader" 
            android:layout_width="match_parent" 
            android:textStyle="bold" 
            android:layout_toRightOf="@id/imgIcon"
            android:paddingLeft="5dip" android:textColor="#ff2525" android:textSize="18dip">
        </TextView>

        <TextView 
            android:layout_height="wrap_content" 
            android:text="" 
            android:id="@+id/txtDialogTOC" 
            android:layout_width="match_parent" 
            android:layout_toRightOf="@id/imgIcon"
            android:layout_below="@id/txtDialogHeader"
            android:paddingLeft="5dip" android:textSize="19dip" android:textStyle="bold">
        </TextView>

    </RelativeLayout>

    <ScrollView    
        android:id="@+id/scrollMessageFrame"  
        android:layout_height="match_parent" 
        android:padding="0dip"
        android:background="#AA0000"
        android:layout_weight="1" android:layout_width="fill_parent">

        <TextView 
            android:layout_height="wrap_content" 
            android:layout_width="match_parent" 
            android:text="" 
            android:id="@+id/lblMessage"  
            android:padding="5dip"
            android:background="#000000"
            android:minHeight="140dip" android:textColor="#f2f2f2" android:textSize="20dip">
        </TextView>

    </ScrollView> 

    <RelativeLayout
        android:id="@+id/contentLayout3" 
        android:orientation="vertical" 
        android:background="#000000" 
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center_horizontal" android:gravity="center_horizontal" android:layout_width="match_parent">

        <ImageButton
            android:id="@+id/cmdResponding"
            android:layout_width="62dip"
            android:layout_height="62dip"
            android:layout_marginRight="10dip"
            android:contentDescription="@string/desc"
            android:src="@drawable/responding_ref" android:background="@drawable/responding_up" android:layout_marginTop="5dip" android:layout_marginLeft="5dip">
</ImageButton>
        <ImageButton android:id="@+id/cmdDeclining" android:src="@drawable/declining_ref" android:background="@drawable/declining_up" android:layout_alignTop="@+id/cmdResponding" android:layout_alignBottom="@+id/cmdResponding" android:layout_height="62dip" android:layout_width="62dip" android:layout_marginLeft="3dip" android:layout_toRightOf="@+id/cmdResponding" android:layout_marginRight="10dip" android:contentDescription="@string/desc"></ImageButton>

        <ImageButton
            android:id="@+id/cmdChiefList"
            android:layout_width="62dip"
            android:layout_height="62dip"
            android:layout_toRightOf="@+id/cmdDeclining" android:background="@drawable/chief_up" android:layout_marginRight="10dip" android:src="@drawable/chief_ref" android:contentDescription="@string/desc" android:layout_marginTop="5dip" android:layout_marginLeft="6dip"/>

        <ImageButton android:id="@+id/cmdMapping" android:background="@drawable/globe_up" android:src="@drawable/mapping_ref" android:layout_height="60dip" android:layout_width="60dip" android:layout_marginLeft="2dip" android:layout_toRightOf="@+id/cmdChiefList" android:layout_marginTop="5dip" android:contentDescription="@string/desc"></ImageButton>

    </RelativeLayout>

</LinearLayout>

<Button 
    android:text="" 
    android:textSize="16dip"
    android:layout_height="40dip" 
    android:layout_width="40dip" 
    android:id="@+id/cmdExit" 
    android:background="@drawable/closepopup"
    android:layout_gravity="top|right" android:contentDescription="@string/desc">
</Button>

</FrameLayout>

我不确定它是否有效,但它会告诉Android使用适当的主题,这可能会解决您的问题。 - Cruceo
我发现你的对话框高度定制化。你是在构建时在Java代码中进行定制,还是从xml文件膨胀布局? - Oscar Salguero
添加了代码,但从创建它的角度来看,它并不算什么特别的。 - tyczj
我只使用常规布局文件夹。 - tyczj
我现在离我的 IDE 远着呢,但我相信在 ICS 中有一个叫做 MinWidth 的对话框主题限定符(例如 Theme.Holo.Light.Dialog.MinWidth),它会使对话框填充而不是像你展示的那样变小。最近我也遇到了这个问题。你可以试试看类似这样的东西。 - Kevin Coppock
显示剩余5条评论
2个回答

6
是的,API 11 的目标是平板电脑和大屏幕,并且 AlertDialog 的设计不会在 Holo 主题中覆盖整个屏幕。其默认大小取决于屏幕大小(表示为屏幕宽度的百分比)。
你的 MessageDialog 的基类不清楚。假设它继承自 AlertDialog,则主题设置对话框的大小。
假设您在清单中有 android:targetSdkVersion>=11,则应用程序使用 Theme.Holo.Dialog.Alert 主题进行对话框操作,该主题设置 android:windowMinWidthMajor 和 android:windowMinWidthMinor 来指定对话框的宽度。
您可以通过将 android:targetSdkVersion=10 设置为修复此问题,或者制作并使用自己的对话框主题,其中父主题将是 Theme.Holo.Dialog.Alert,您将覆盖上述宽度项。

MessageDialog的基类是“Dialog”,我针对的SDK版本是8,但我认为你说的宽度是基于屏幕尺寸的是正确的,因为我确实注意到在平板电脑上它更大。 - tyczj

1
如果您要使用自定义对话框,最好将它们放在XML文件中。
在我的自定义对话框中,我使用RelativeLayout和android:layout_width="wrap_content",它们可以适应屏幕方向和内容。
dialog_layout.xml应该长这样:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/dialog_background"
    android:padding="@dimen/dialog_padding" >

    <TextView
    android:id="@+id/text_view"
    style="@style/WhiteTextLabel"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true"
    android:text="@string/dialog_text" />

    <LinearLayout
        android:id="@+id/buttons"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/text_view"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/button_cancel" 
            style="@style/RedCancelButton"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/button_cancel" />

        <Button
            android:id="@+id/button_done"
            style="@style/GreenDoneButton"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/button_done" />
    </LinearLayout>
</RelativeLayout>

从Java代码中膨胀它:

final Dialog aDialog = new Dialog(this);
aDialog.requestWindowFeature(Window.FEATURE_LEFT_ICON);
aDialog.setTitle(getString(R.string.dialog_title));
aDialog.setContentView(R.layout.dialog_layout);
aDialog.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.ic_dialog_icon);
aDialog.setCancelable(true);

final Button buttonDone = (Button) aDialog.findViewById(R.id.button_done);
final Button buttonCancel = (Button) aDialog.findViewById(R.id.button_cancel);

    buttonDone.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        // TODO Do something...
        aDialog.cancel();
    }
    });             
    buttonCancel.setOnClickListener(new OnClickListener() {                 
    public void onClick(View v) {
        // Do nothing
        aDialog.cancel();
    }
    });         
aDialog.show();

我的minSdkVersion是8,targetSdkVersion是15。我没有为对话框应用任何主题,但我正在自定义背景(一个形状可绘制对象),按钮(使用样式)等。在任何方向的Froyo到ICS设备上,对话框看起来和行为都相同。

我只有一个xml文件在我的/layout/文件夹中...但您可能想在您的/layout-land/文件夹中创建另一个具有相同名称的xml文件,并进行一些调整以适应方向。

新的API有Dialog Fragments,参见Using Dialog Fragments,您可能也想看一下它们。

希望这可以帮助您。祝你好运!


是的,我的对话框是在XML中创建的,宽度设置为fill_parent,并在layout-land文件夹中创建一个带有硬宽度的副本文件是我解决问题的方法,但我很好奇为什么它在ICS上显示不同于以前。 - tyczj
很抱歉我的回答没有帮到你,但也许布局中的硬宽度是导致问题的原因... 你尝试过将Dialog的父视图的layout_width设置为wrap_content,并将TextView的layout_width设置为fill_parent吗?另一个选项是在显示Dialog之前根据屏幕宽度调整Dialog内部TextView的最小宽度和每行字符数... 如果使用固定值,你会遇到问题,最好使用fill_parent、wrap_content和match_parent或使用屏幕指标。 - Oscar Salguero
我只是在注意到它没有像旧版本那样填充时才添加了硬宽度。我知道设置硬值不是一个好主意,但那是我能让它正确显示的唯一方法。 - tyczj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接