2013-03-02 14 views
10

Ich versuche, eine AlertDialog mit einem benutzerdefinierten view (kein Titel oder Fußzeile) und abgerundeten Ecken zu bauen. Ich habe viele Posts darüber gesehen, wie das geht, und ich habe viele Dinge ausprobiert, aber ich kann es nicht so bauen, wie ich es möchte.Android: AlertDialog mit benutzerdefinierten Ansicht und abgerundeten Ecken

Das ist mein Ziel:

enter image description here

ich für die dialog eine drawable erstellt dialog_background.xml genannt:

<shape xmlns:android="http://schemas.android.com/apk/res/android" > 

    <solid 
     android:color="#FFAAAAAA" /> 

    <stroke 
     android:width="2dp" 
     android:color="#FF000000" /> 

    <corners android:radius="20dp" /> 
</shape> 

Und ich fügte eine style, es zu benutzen:

<style name="MyDialog" parent="@android:style/Theme.Dialog"> 
    <item name="android:background">@drawable/dialog_background</item> 
</style> 

Die layout meiner benutzerdefinierten view wird zwei Tasten haben. Im Moment zeige ich Ihnen eine leere LinearLayout um es einfach zu machen. Dies ist playdialog.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    style="@style/MyDialog" 
    > 

</LinearLayout> 

Um die Dialog zu bauen Ich benutze einen DialogFragment. Dies ist seine onCreateDialog Funktion:

public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 

    builder.setView(inflater.inflate(R.layout.playdialog, null)); 
    return builder.create(); 
} 

Ok, wenn ich den Code so verwende ich diese:

enter image description here

ich den dialog Hintergrund transparent zu modifizieren meinen DialogFragment Code zu setzen versucht:

Das Ergebnis ist genau das gleiche, also habe ich festgestellt, dass das weiße Rechteck u meine dialogist von meiner Gewohnheit view, nicht von der dialog. Ich setze bereits meinen view Hintergrund auf dialog_background.xml, also kann ich es auch nicht auf transparent setzen oder ich verliere die Ecken, die Farbe, etc.

Dann habe ich beschlossen, den dialog Hintergrund mit zu ändern dialog_background.xml und meine Ansicht hat eine einfarbige Farbe als Hintergrund.

In meiner benutzerdefinierten viewlayout (playdialog.xml) I ersetzt style = "@ style/MyDialog" mit:

android:background="#FFAAAAAA" 

Und dann in meiner DialogFragment habe ich diesen Code:

public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 

    builder.setView(inflater.inflate(R.layout.playdialog, null)); 

    **NEW**   

    Dialog d = builder.create(); 
    d.getWindow().setBackgroundDrawableResource(R.drawable.dialog_background); 
    return d; 
} 

Das ist, was ich bekomme:

enter image description here

Es ist fast das, was ich wollte, aber Sie können meine benutzerdefinierten view Grenzen sehen, so dass es nicht gut genug ist. An diesem Punkt wusste ich nicht, was ich noch tun könnte.

Wer weiß, wie kann ich es lösen?

Danke!

+0

könnten Sie das Problem beheben? Mit abgerundete Ecke, ich bin nicht in der Lage, die weißen Abschnitte in der corder – sabbir

Antwort

5

Ich habe gerade einen benutzerdefinierten Alarm-Dialog. Aber seine Ecken sind nicht abgerundet.

zunächst ein Layout für sie als erstellen -

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="240sp" 
android:layout_height="wrap_content" 
android:background="#FFFFFF" 
tools:ignore="SelectableText" > 

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="1sp" 
    tools:ignore="UselessParent" > 

    <TableLayout 
     android:id="@+id/tablelayout_dialog_title" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:stretchColumns="1" > 

     <TableRow 
      android:id="@+id/tablerow_dialog_title" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content"    
      tools:ignore="UselessParent" > 

      <ImageView 
       android:id="@+id/imageview_dialog_image" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:src="@drawable/alertwhite" 
       android:layout_gravity="center" 
       android:background="#643c3a" 
       android:contentDescription="@string/string_todo"/> 

      <TextView 
       android:id="@+id/textview_dialog_title" 
       android:layout_width="wrap_content" 
       android:layout_height="fill_parent" 
       android:background="#643c3a" 
       android:padding="10sp" 
       android:gravity="center_vertical" 
       android:textColor="#FFFFFF" 
       android:textSize="15sp" /> 

     </TableRow>  
    </TableLayout> 

    <View 
     android:id="@+id/viewline_dialog" 
     android:layout_below="@+id/tablelayout_dialog_title" 
     android:layout_width = "wrap_content" 
     android:layout_height="0.25dip" 
     android:background="#ffffff"   
     android:layout_centerVertical ="true" /> 

    <TextView 
     android:id="@+id/textview_dialog_text" 
     android:layout_below="@+id/viewline_dialog" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:padding="8sp" 
     android:background="#643c3a" 
     android:textColor="#FFFFFF" 
     android:textSize="12sp" /> 

    <View 
     android:id="@+id/viewline1_dialog" 
     android:layout_width = "wrap_content" 
     android:layout_height="0.5dip" 
     android:background="#ffffff"   
     android:layout_centerVertical ="true" 
     android:layout_below="@+id/textview_dialog_text"/> 

    <TableLayout 
     android:id="@+id/tablelayout_dialog_button" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:stretchColumns="*" 
     android:layout_below="@+id/viewline1_dialog" 
     android:background="#a8a8a8" > 

     <TableRow 
      android:id="@+id/tablerow_dialog_button" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content"    
      tools:ignore="UselessParent" > 

      <Button 
       android:id="@+id/button_dialog_yes" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_margin="8sp" 
       android:paddingTop="5sp" 
       android:paddingBottom="5sp" 
       android:background="@drawable/roundedcornerbuttonfordialog_shape" 
       android:text="@string/string_yes" /> 

      <Button 
       android:id="@+id/button_dialog_no" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_margin="8sp" 
       android:paddingTop="5sp" 
       android:paddingBottom="5sp" 
       android:background="@drawable/roundedcornerbuttonfordialog_shape" 
       android:text="@string/string_no" /> 

     </TableRow> 
    </TableLayout> 

</RelativeLayout> 

nun den Code des Dialog schreiben, wie -

public static void callAlert(String message, final Context context){ 
    final Dialog dialog = new Dialog(context); 
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setContentView(R.layout.customdialog_layout); 
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.WHITE));    

    TextView tvTitle = (TextView) dialog.findViewById(R.id.textview_dialog_title); 
    tvTitle.setText("MyApp.."); 

    TextView tvText = (TextView) dialog.findViewById(R.id.textview_dialog_text); 
    tvText.setText(message);  

    Button buttonDialogYes = (Button) dialog.findViewById(R.id.button_dialog_yes); 
    buttonDialogYes.setOnClickListener(new OnClickListener() {   
     public void onClick(View v) { 
      // Do your stuff... 
      dialog.dismiss(); 
     } 
    }); 

    Button buttonDialogNo = (Button) dialog.findViewById(R.id.button_dialog_no); 
    buttonDialogNo.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      // Do your stuff... 
      dialog.dismiss(); 
     }   
    }); 
    dialog.show(); 
} 

Und rufen Sie diese Methode als -

String message = "Your Message"; 
callAlert(message, callingClass.this); 

Hoffe, das wird Hel p du.

+1

Die Verwendung eines Dialogs anstelle von AlertDialog, wie Sie es taten, löste das Problem. Vielen Dank! : D –

+0

IMO, ich würde kein TableLayout verwenden, um zu versuchen und Formatierung zu machen. Ich würde bei Linear, Relativ und Frame bleiben. Reduzieren Sie Ihre Ansichtshierarchie, um die Leistung zu verbessern. – jpotts18

-1

Warum verwenden Sie nicht das Bild, das Sie anzeigen, wie "Dies ist mein Ziel:" Speichern Sie Ihr Ziel bg Bild im Zeichnungsordner.

private AlertDialog createAlertDialog() { 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setView(getLayoutInflater().inflate(R.layout.playdialog, null)); 
    return builder.create(); 
} 

dann

AlertDialog dialog = createAlertDialog(); 
dialog.show(); 
+0

Verwendung von Bildern ist nicht aus Gründen wie Skalierbarkeit und Rechenzeit und unnötigen Stromverbrauch für die gleichen zu empfehlen. – computingfreak

0

Der Code unten löste das Problem

MyDialog mydialog = new MyDialog(this, "for testing", 
      new myOnClickListener() { 

       @Override 
       public void onPositiveButtonClick() { 
        // TODO Auto-generated method stub 
        Toast.makeText(getApplicationContext(), 
          "I am positive button in the dialog", 
          Toast.LENGTH_LONG).show(); 
       } 

       @Override 
       public void onNegativeButtonClick() { 
        // TODO Auto-generated method stub 
        Toast.makeText(getApplicationContext(), 
          "I am negative button in the dialog", 
          Toast.LENGTH_LONG).show(); 
       } 
      }); 

    // this will remove rectangle frame around the Dialog 
    mydialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); 
    mydialog.show(); 

Danke, Nagendra

+0

hat es die weißen Abschnitte im corder nicht beseitigt :( – sabbir

Verwandte Themen