2013-05-31 17 views
17

Sto cercando di creare una finestra di dialogo personalizzata con gli angoli arrotondati. I miei attuali tentativi mi hanno dato questo risultato.Finestra di dialogo Android - Angoli arrotondati e trasparenza

rounded corner dialog

Come si può vedere, gli angoli sono arrotondati, ma lascia l'angolo bianco ancora intatto.

Di seguito è l'xml che ho inserito nella cartella disegnabile per creare la finestra di dialogo blu con il bordo rosso con gli angoli arrotondati.

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <shape 
      android:shape="rectangle"> 
      <solid android:color="@color/transparent_black" /> 
      <corners android:radius="@dimen/border_radius"/> 
     </shape> 
    </item> 
    <item 
     android:left="@dimen/border_width" 
     android:right="@dimen/border_width" 
     android:top="@dimen/border_width" 
     android:bottom="@dimen/border_width" > 

     <shape android:shape="rectangle"> 
      <solid android:color="@color/blue" /> 
      <corners android:radius="@dimen/border_radius"/> 
     </shape> 
    </item>  
</layer-list> 

Di seguito è riportato il layout della finestra di dialogo.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
style="@style/fill" 
android:orientation="vertical" 
android:layout_margin="@dimen/spacing_normal" 
android:padding="@dimen/spacing_normal" 

android:background="@drawable/border_error_dialog" > 

<RelativeLayout 
    style="@style/block" 
    android:layout_gravity="center" > 

    <ImageView 
     android:id="@+id/imageView1" 
     style="@style/wrap" 
     android:layout_alignParentLeft="true" 
     android:layout_centerHorizontal="true" 
     android:contentDescription="@string/content_description_filler" 
     android:src="@drawable/ic_launcher" /> 

    <TextView 
     android:id="@+id/textView1" 
     style="@style/error_text" 
     android:layout_centerVertical="true" 
     android:layout_toRightOf="@+id/imageView1" 
     android:text="@string/error_login" /> 

</RelativeLayout> 

<Button 
    android:id="@+id/button1" 
    style="@style/wrap" 
    android:layout_gravity="center" 
    android:text="Button" /> 

</LinearLayout> 

E sotto è l'attività in cui creo la finestra di dialogo.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Button b1 = (Button) findViewById(R.id.button1); 
    b1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) {    
      AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this); 

      View child = getLayoutInflater().inflate(R.layout.dialog_custom_tom, null); 
      alertDialogBuilder.setView(child); 

      AlertDialog alertDialog = alertDialogBuilder.create(); 

      alertDialog.show(); 
     } 
    }); 
} 

risposta

1

Utilizzare PNG a 9 patch con trasparenza in quegli angoli.

+0

Qualsiasi esempio di codice? – Talha

+0

Questa non è una soluzione di codice sorgente. È un file PNG a 9 patch https://developer.android.com/studio/write/draw9patch.html –

10

Ho avuto problema simile quando dialogo fatto estendendo DialogFragment e per risolvere questo mezzo:

dialog.setStyle(DialogFragment.STYLE_NO_FRAME, 0); 

Come questo:

public class ConfirmBDialog extends DialogFragment { 

public static ConfirmBDialog newInstance() { 
    ConfirmBDialog dialog = new ConfirmBDialog(); 
    Bundle bundle = new Bundle(); 
    dialog.setArguments(bundle); 

    dialog.setStyle(DialogFragment.STYLE_NO_FRAME, 0); 

    return dialog; 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.confirm_dialog, container, true); 
    getDialog().setCanceledOnTouchOutside(true); 
    return view; 
} 

}

Spero che questo aiuti.

+1

@greatergoodguy, per favore se questa risposta è una soluzione per il tuo problema, accettalo – RiadSaadi

+0

Dopo aver provato a lungo questa è l'unica soluzione quello ha funzionato per me! Grazie! – andrew

+0

Funziona perfettamente, grazie! È l'unica soluzione che ho trovato che funziona con DialogFragments ... – Aenadon

26

L'unica soluzione che ho trovato è here. Utilizzare la finestra di dialogo anziché AlertDialog e impostare lo sfondo trasparente:
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
Pertanto non è possibile utilizzare il builder. Ma puoi usare la nuova finestra di dialogo() anche nel callback onCreateDialog di DialogFragment se segui le migliori linee guida.

Questo funziona anche per Gingerbread.

Oltre al drawable a livelli può essere semplificato a una forma con l'elemento xml <corsa> per il bordo.

+1

Passando alla finestra di dialogo invece di AlertDialog lo ho finalmente risolto. Grazie amico mio :) – Shirane85

+0

come farlo per popups –

6

Basta provare

myDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 
0

Il sotto codice 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

2

In te di file java mantengono sotto il codice e modificare il nome di layout

View mView =LayoutInflater.from(mContext).inflate(R.layout.layout_pob,null); 
alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
+0

Sta funzionando. Grazie .. ☺️ – SamSol

0
public void initDialog() { 
    exitDialog = new Dialog(this); 
    exitDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
    View view = View.inflate(this, R.layout.dialoglayout, null); 
    exitDialog.setContentView(view); 
    AdSize adSize = new AdSize(300, 250); 

    dialogAdview = new AdView(this); 
    dialogAdview.setAdUnitId(getResources().getString(R.string.banner_id)); 
    dialogAdview.setAdSize(adSize); 
    RelativeLayout adLayout = (RelativeLayout) view.findViewById(R.id.adLayout); 
    adLayout.addView(dialogAdview); 
    AdRequest adRequest = new AdRequest.Builder() 
      .build(); 
    dialogAdview.loadAd(adRequest); 
    dialogAdview.setAdListener(new AdListener() { 
     @Override 
     public void onAdLoaded() { 
      Log.d("Tag", "adLoaded"); 
      super.onAdLoaded(); 
     } 


    }); 

    view.findViewById(R.id.yes_btn).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      exit = true; 
      onBackPressed(); 
     } 
    }); 

    view.findViewById(R.id.no_btn).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      exit = false; 
      exitDialog.dismiss(); 
     } 
    }); 

} 

DialogLayout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:ads="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/custom_dialog_round" 
    android:orientation="vertical"> 


    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_marginLeft="10dp" 
     android:text="Do you want to exit?" 
     android:textColor="#000" 
     android:textSize="18dp" /> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/text" 
     android:orientation="horizontal"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:layout_weight="1" 
      android:gravity="center" 
      android:orientation="horizontal"> 

      <TextView 
       android:id="@+id/yes_btn" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:background="@drawable/background_draw" 
       android:padding="8dp" 
       android:text="Yes" 
       android:textAlignment="center" 
       android:textColor="#9fa8da" 
       android:textSize="20dp" /> 
     </LinearLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:layout_weight="1" 
      android:gravity="center" 
      android:orientation="horizontal"> 

      <TextView 
       android:id="@+id/no_btn" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_marginRight="10dp" 
       android:background="@drawable/background_draw" 
       android:padding="8dp" 
       android:text="No" 
       android:textAlignment="center" 
       android:textColor="#d50000" 
       android:textSize="20dp" /> 
     </LinearLayout> 


    </LinearLayout> 

</LinearLayout> 
` 

custom_dialog_round.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid 
     android:color="#fff"/> 
    <corners 
     android:radius="10dp" /> 
    <padding 
     android:left="10dp" 
     android:top="10dp" 
     android:right="10dp" 
     android:bottom="10dp" /> 
</shape> 

riferimento http://techamongus.blogspot.com/2018/02/android-create-round-corner-dialog.html