2013-03-02 17 views
10

Sto cercando di creare un AlertDialog con un view personalizzato (senza titolo o piè di pagina) e angoli arrotondati. Ho visto molti post su come farlo e ho provato un sacco di cose, ma non riesco a costruirlo come vorrei.Android: AlertDialog con visualizzazione personalizzata e angoli arrotondati

Questo è il mio obiettivo:

enter image description here

ho creato un drawable per la dialog chiamato dialog_background.xml:

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

E ho aggiunto un style usarlo:

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

Il layout della mia dogana view avrà due pulsanti. In questo momento ti mostro uno LinearLayout vuoto per renderlo semplice. Questo è 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> 

Per costruire il Dialog io uso un DialogFragment. Questa è la sua onCreateDialog funzione:

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, se uso il codice così ottengo questo:

enter image description here

ho cercato di impostare il dialog sfondo a trasparente modificare il mio codice DialogFragment:

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().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 
    return d; 
} 

Il risultato è esattamente lo stesso, quindi ho capito che quel rettangolo bianco si il mio dialogproviene dalla mia versione personalizzata view, non dallo dialog. Sto già impostando lo sfondo di view su dialog_background.xml, quindi non posso impostarlo su trasparente o ho perso angoli, colore, ecc.

Quindi ho deciso di modificare lo sfondo di dialog utilizzando dialog_background.xml e la mia vista ha un colore a tinta unita come sfondo.

Nella mia abitudine viewlayout (playdialog.xml) ho sostituito style = "@ stile/MyDialog" con:

android:background="#FFAAAAAA" 

E poi nel mio DialogFragment ho usato questo codice:

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

Questo è quello che ottengo:

enter image description here

È quasi quello che volevo, ma puoi vedere i miei bordi personalizzati view, quindi non è abbastanza buono. A questo punto non sapevo cos'altro potessi fare.

Qualcuno sa come posso risolverlo?

Grazie!

+0

potresti risolvere il problema? Con l'angolo arrotondato, non sono in grado di eliminare le sezioni bianche nel corder – sabbir

risposta

5

Ho appena creato una finestra di dialogo avviso personalizzato. Ma i suoi angoli non sono arrotondati.

Innanzitutto creare un layout per come -

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

Ora scrivere il codice della finestra di dialogo come -

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

E chiamare questo metodo come -

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

Spero che questo serva p tu

+1

Utilizzare una finestra di dialogo al posto di AlertDialog, come hai fatto tu, ha risolto il problema. Grazie! : D –

+0

IMO, non userei un TableLayout per provare a fare la formattazione. Mi attenersi a Linear, Relative e Frame. Uniformare la gerarchia della vista aumenta il rendimento. – jpotts18

-1

perché non si utilizza l'immagine che si sta visualizzando come "Questo è il mio obiettivo:" salvare il tuo obiettivo bg immagine in cartella disegnabile.

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

poi

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

l'uso di immagini non è raccomandato per motivi quali scalabilità, tempo di re-rendering di calcolo e consumo di energia non necessario per lo stesso. – computingfreak

0

Il codice sotto risolto il problema

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

Grazie, Nagendra

+0

non ha eliminato le sezioni bianche nel corder :( – sabbir