Ist es möglich, Drawables den positive, negativ und neutral Tasten eines Alertdialog hinzufügen? Wenn ja, wie?Bilder Alertdialog Tasten
Antwort
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
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;
}
}
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.
Will versuchen und zurück zu diesem Frank. –
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
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.
Wird überprüft und zurück zu Ihnen. Vielen Dank. –
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
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 :).
Vielen Dank für das Update :) –
Hallo Ich möchte Symbol näher zum Text spielen zeigen. Kannst du mir bitte vorschlagen? –
Können Sie bitte ein Beispiel für die Verwendung Ihres Codes geben? Wie man den Dialog instanziiert? –