2010-09-09 2 views

Antwort

13

Da onPrepareDialog veraltet ist, können Sie die onShowListener stattdessen verwenden können.

Auch sollten Sie die Drawable Grenzen setzen oder es wird weit links platziert.

Ausgabe-Code unten

Output of Code below

public class MyDialog extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     final AlertDialog dialog = new AlertDialog.Builder(getActivity()) 
       .setTitle("My Dialog") 
       .setNegativeButton("Cancel", new OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         // TODO Auto-generated method stub 
        } 
       }).setPositiveButton("Play", new OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         // TODO Auto-generated method stub 
        } 
       }).create(); 
     dialog.setOnShowListener(new OnShowListener() { 

      @Override 
      public void onShow(DialogInterface dialogInterface) { 
       Button button = dialog.getButton(AlertDialog.BUTTON_POSITIVE); 

       // if you do the following it will be left aligned, doesn't look 
       // correct 
       // button.setCompoundDrawablesWithIntrinsicBounds(android.R.drawable.ic_media_play, 
       // 0, 0, 0); 

       Drawable drawable = getActivity().getResources().getDrawable(
         android.R.drawable.ic_media_play); 

       // set the bounds to place the drawable a bit right 
       drawable.setBounds((int) (drawable.getIntrinsicWidth() * 0.5), 
         0, (int) (drawable.getIntrinsicWidth() * 1.5), 
         drawable.getIntrinsicHeight()); 
       button.setCompoundDrawables(drawable, null, null, null); 

       // could modify the placement more here if desired 
       // button.setCompoundDrawablePadding(); 
      } 
     }); 
     return dialog; 
    } 
} 
+0

Vielen Dank für das Update :) –

+0

Hallo Ich möchte Symbol näher zum Text spielen zeigen. Kannst du mir bitte vorschlagen? –

+0

Können Sie bitte ein Beispiel für die Verwendung Ihres Codes geben? Wie man den Dialog instanziiert? –

7

Nachdem Sie aufgebaut haben, die AlertDialog in onCreateDialog Sie den folgenden Code in onPrepareDialog verwenden können, um ein Bild zu der positiven Schaltfläche hinzuzufügen:

@Override 
protected void onPrepareDialog(int id, Dialog dialog) { 
    super.onPrepareDialog(id, dialog); 
    AlertDialog alertDialog = (AlertDialog)dialog; 
    Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); 
    button.setCompoundDrawablesWithIntrinsicBounds(this.getResources().getDrawable(
      R.drawable.icon), null, null, null); 

} 

Der Versuch, die ziehbar auf die Schaltfläche in der onCreateDialog Methode hinzufügen nicht scheinen zu arbeiten.

+0

Will versuchen und zurück zu diesem Frank. –

4

Sie können Schaltflächen in den onCreateDialog hinzufügen und muss es in der onPrepareDialog tun, weil Alertdialog von Android auf eine ganz besondere Art und Weise behandelt werden:

Sie eigentlich nicht wirklich einen Verweis auf den realen Dialog halten, wenn Wenn Sie den Warnungsdialog verwenden, ist das Objekt, das Sie mithilfe von AlertDialog.Builder.create() erhalten, nur ein Gesicht für einen inneren Controller.

Und bevor create tatsächlich aufgerufen wird, gibt es keinen solchen Controller in der jvm. Nur die Fassade. Also, bis diese Methode aufgerufen wird (am Ende von onCreateDialog, wenn Sie Ihre Aktivität eigene Dialoge verwalten lassen), existiert der echte Controller nicht, und echte Buttons auch nicht.

brandneue SOF Kommentator, Stéphane

5

Dies kann, indem man einen Verweis auf die Schaltfläche erfolgen mit Hilfe der getButton() -Methode:

alert.show(); 
Button email = alert.getButton(AlertDialog.BUTTON_NEUTRAL); 
email.setBackgroundResource(R.drawable.email); 

Beachten Sie, dass die getButton verwenden müssen() nach dem Aufruf Die Methode show(), andernfalls erhalten Sie eine NullPointerException.

+0

Wird überprüft und zurück zu Ihnen. Vielen Dank. –

0

1.Erste eine neue Layout-Datei erstellen, um die imagebuttons zu speichern: new_layout.xml;

<?xml version="1.0" encoding="UTF-8" ?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_margin="15dp" 
    android:gravity="center_horizontal" 
    android:background = "#FFFFFF" 
    android:orientation="horizontal"> 

    <!-- game button --> 
    <ImageButton 
     android:id="@+id/game" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:layout_margin="5dp" 
     android:layout_gravity="bottom" 
     android:background = "#00ffffff" 
     android:src="@drawable/game"/> 

    <!-- browser button --> 
    <ImageButton 
     android:id="@+id/browser" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:layout_margin="5dp" 
     android:layout_gravity="bottom" 
     android:background = "#00ffffff" 
     android:src="@drawable/browser"/> 

    <!-- email button --> 
    <ImageButton 
     android:id="@+id/email" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:layout_margin="5dp" 
     android:layout_gravity="bottom" 
     android:background = "#00ffffff" 
     android:src="@drawable/email"/> 

</LinearLayout> 

2.Add den Code unten, wo Sie den Dialog angezeigt werden soll:

final AlertDialog alertDialog = new AlertDialog.Builder(TalkerActivity.this).create(); 
    alertDialog.show(); 
    Window win = alertDialog.getWindow(); 
    win.setContentView(R.layout.new_layout); 

    //Game 
    ImageButton game_btn = (ImageButton)win.findViewById(R.id.game); 
    game_btn.setOnClickListener(new OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

     } 
    }); 

    //Browser 
    ImageButton browser_btn = (ImageButton)win.findViewById(R.id.browser); 
    browser_btn.setOnClickListener(new OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

     } 
    }); 

    //Email 
    ImageButton email_btn = (ImageButton)win.findViewById(R.id.email); 
    email_btn.setOnClickListener(new OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

     } 
    }); 

Link: http://blog.csdn.net/willproud/article/details/9191971

2

Wie @aaronvargas sagte verwenden onShowListener. Ich werde seine Antwort ein wenig verbessern, da für ältere/kleinere Geräte das Bild den Text überlappt.Hier ist der onShow Code:

@Override 
public void onShow(DialogInterface dialogInterface) { 
    Button button = dialog.getButton(AlertDialog.BUTTON_POSITIVE); 
    button.setCompoundDrawablesWithIntrinsicBounds(R.drawable.your_img, 0, 0, 0); 
    Utils.centerImageAndTextInButton(button); 
} 

Hier wird eine Nutzenfunktion ein linkes Bild und Text in einem Button zum Zentrum:

public static void centerImageAndTextInButton(Button button) { 
    Rect textBounds = new Rect(); 
    //Get text bounds 
    CharSequence text = button.getText(); 
    if (text != null && text.length() > 0) { 
     TextPaint textPaint = button.getPaint(); 
     textPaint.getTextBounds(text.toString(), 0, text.length(), textBounds); 
    } 
    //Set left drawable bounds 
    Drawable leftDrawable = button.getCompoundDrawables()[0]; 
    if (leftDrawable != null) { 
     Rect leftBounds = leftDrawable.copyBounds(); 
     int width = button.getWidth() - (button.getPaddingLeft() + button.getPaddingRight()); 
     int leftOffset = (width - (textBounds.width() + leftBounds.width()) - button.getCompoundDrawablePadding())/2 - button.getCompoundDrawablePadding(); 
     leftBounds.offset(leftOffset, 0); 
     leftDrawable.setBounds(leftBounds); 
    } 
} 

Diese letzte Funktion verwendet die Breite des Button, um die Berechnung zu machen, so müssen Sie überprüfen, dass Sie dies an der richtigen Stelle aufrufen. Das heißt, die Breite sollte nicht Null sein. In diesem Fall ist es von onShow der richtige Ort :).