Fin da quando android è stato lanciato, creare un dialog con un layout personalizzato è sempre stato un po' macchinoso, anche perché la classe Dialog non era pensata per questo.
Fortunatamente con la API level 11 il team di Android ha rilasciato il DialogFragment che è poi stato aggiunto alla support library rendendolo disponibile per tutti i target.
Un DialogFragment è un fragment che mostra una finestra di dialogo sovrapposta a quella dell'activity cui appartiene. Poiché è un fragment, si integra nel lifecycle dell'activity ed assicura che ciò che succede nella finestra di dialogo rimanga consistente (mentre i dialog erano generalmente delle entità autonome).
Creare un Dialog personalizzato con il DialogFragment è piuttosto semplice, basta estendere la classe DialogFragment in questo modo:
public class MyCustomDialogFragment extends DialogFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_my_custom_dialog, container, false); // Do all the stuff to initialize your custom view return v; } }
Ora non resta che implementare il codice per mostrare il dialog all'interno della nostra activity o fragment.
Poiché il DialogFragment è un fragment basterà creare una fragment transaction e poi invocare il metodo show di MyCustomDialogFragment:
FragmentTransaction ft = getFragmentManager().beginTransaction(); Fragment prev = getFragmentManager().findFragmentByTag("dialog"); if (prev != null) { ft.remove(prev); } ft.addToBackStack(null); DialogFragment dialogFragment = new MyCustomDialogFragment(); dialogFragment.show(ft, "dialog");
Il metodo show si occuperà di aggiungere il DialogFragment alla transaction e di farne il commit.
Sebbene la prima riga e le ultime due siano sufficienti a mostrare il dialog, avrete notato che sono state aggiunte alcune altre righe di codice dopo la creazione della FragmentTransaction.
Questo codice serve ad assicurare che non ci sia un'altra istanza del dialog ancora visibile.
Per nascondere il dialog basterà fare così:
dialogFragment.dismiss();
Questa è solo un'infarinatura su come usare i DialogFragment, una documentazione più approfondita è disponibile sull'Android Developer Portal.
Questo post è disponibile anche su Medium (in inglese).