tyczj
tyczj

Reputation: 73753

Dialog displays differently on ICS devices that it does with older versions

When I display a dialog on my ICS device in landscape mode the dialog shows in the same width as it did in portrait mode.

enter image description here

but on a device running gingerbread when the dialog is in landscape mode it displays the width across the screen not having everything compact

enter image description here

did they change how the dialog display's in ICS where it will not display across the screen like in the second picture? How can I get it back to show like the second picture so it does not look compact like the first one?

also the targeted api for this application is 2.2 so I cant use any ICS api's or anything

EDIT

this is how I call my dialogs

incDialog = new MessageDialog(this, R.style.FullHeightDialog);
incDialog.PopUpMessage(this, oMessage);

Dialogs are in a separate class that extends dialog

this is the PopUpMessage method that actually shows the daialog

    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 {
    }
}

here is the xml layout

<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>

Upvotes: 3

Views: 1588

Answers (2)

Oscar Salguero
Oscar Salguero

Reputation: 10365

If you're going to have custom Dialogs, it is better to have them in a XML file.

In my custom dialogs, I'm using a RelativeLayout with android:layout_width="wrap_content" and they adapt to the screen orientation and its contents just right.

The dialog_layout.xml should look something like this:

<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>

To inflate it from Java code:

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();

My minSdkVersion is 8 and targetSdkVersion is 15. I'm not applying any theme to the dialog, but I'm customizing background (a shape drawable), buttons (with styles) etc. The dialog looks and behaves the same in devices from Froyo to ICS in any orientation.

I just have 1 xml in my /layout/ folder... but you might want to create another xml with the same name with some tweaks according to the orientation in your /layout-land/ folder.

The new APIs have Dialog Fragments though Refer Using Dialog Fragments, you might want to take a look at them too.

I hope this helps. Good luck!

Upvotes: 1

Pointer Null
Pointer Null

Reputation: 40380

Yes, API 11 is targeted to tablets and large screens, and AlertDialog is designed not to cover entire screen in Holo theme. Its default size depends on screen size (is expressed as percentual width of screen width).

It's not clear what is base class of your MessageDialog. Assuming it inherits AlertDialog, then a theme sets size of dialog.

Assuming you have android:targetSdkVersion>=11 in the manifest, app uses Theme.Holo.Dialog.Alert theme for the dialog, which sets android:windowMinWidthMajor and android:windowMinWidthMinor to specify width of dialog.

You can fix this either by setting android:targetSdkVersion=10, or by making and using own theme for dialog where parent theme would be Theme.Holo.Dialog.Alert and you'd overwrite mentioned width items.

Upvotes: 6

Related Questions