My app shows many custom dialog like Yes/No or Accept/Cancel decissions and, while I was coding, I realized that there are so much code repeated, following the same schema.
I want to build a general class but I don't know how to do it or, more exactly, the correct way that I have to do it(interfaces, abstract classes, inheritance, static classes, ...)
This is my current class:
public class DialogTwoOptions extends Dialog {  TextView title_tv; // Button yes_btn, no_btn;  public DialogTwoOptions(Context context)  {     super(context);          setContentView(R.layout.dialogo_sino); // a simple layout with a TextView and Two Buttons      title_tv = (TextView) findViewById(R.id.dialogo_titulo_sino);     // yes_btn = (Button) findViewById(R.id.dialogo_aceptar);      // no_btn = (Button) findViewById(R.id.dialogo_cancelar);      View v = getWindow().getDecorView();     v.setBackgroundResource(android.R.color.transparent); }   public void quitDialog(View v) {      if (isShowing()) dismiss();  }   public void setTitle(String title) {      title_tv.setText(title);  }   }
And this is what I am doing when I need to use this class:
final DialogTwoOptions dialog = new DialogTwoOptions(this);      Button yes = (Button) dialog.findViewById(R.id.dialog_yes_btn);     Button no = (Button) dialog.findViewById(R.id.dialog_no_btn);      yes.setOnClickListener(new Button.OnClickListener()      {         public void onClick(View v)     {             dialog.dismiss();             // Do something          }     });      no.setOnClickListener(new Button.OnClickListener()      {         public void onClick(View v)     {             dialog.dismiss();             // Do something         }     });      dialog.show();   I am sure that it is improvable, but how could you do this?
Thanks
First create an Base DialogFragment to keep hold of the instance of  the Activity. So when the Dialog is attached to the Activity , you will know the instance of the Activity which created it.
public abstract class BaseDialogFragment<T> extends DialogFragment {         private T mActivityInstance;          public final T getActivityInstance() {                 return mActivityInstance;         }          @Override         public void onAttach(Activity activity) {                 mActivityInstance = (T) activity;             super.onAttach(activity);         }          @Override         public void onDetach() {                 super.onDetach();                 mActivityInstance = null;         } }   Then, create a GeneralDialogFragment which extends the BaseDialogFragment
public class GeneralDialogFragment extends BaseDialogFragment<GeneralDialogFragment.OnDialogFragmentClickListener> {          // interface to handle the dialog click back to the Activity         public interface OnDialogFragmentClickListener {             public void onOkClicked(GeneralDialogFragment dialog);             public void onCancelClicked(GeneralDialogFragment dialog);         }          // Create an instance of the Dialog with the input         public static GeneralDialogFragment newInstance(String title, String message) {             GeneralDialogFragment frag = new GeneralDialogFragment();             Bundle args = new Bundle();             args.putString("title", title);             args.putString("msg", message);             frag.setArguments(args);             return frag;         }         // Create a Dialog using default AlertDialog builder , if not inflate custom view in onCreateView         @Override         public Dialog onCreateDialog(Bundle savedInstanceState) {              return new AlertDialog.Builder(getActivity())                 .setTitle(getArguments().getString("title"))                 .setMessage(getArguments().getString("message"))                 .setCancelable(false)                 .setPositiveButton("OK",                     new DialogInterface.OnClickListener() {                         public void onClick(DialogInterface dialog, int whichButton) {                             // Positive button clicked                             getActivityInstance().onOkClicked(GeneralDialogFragment.this);                         }                     }                 )                 .setNegativeButton("Cancel",                     new DialogInterface.OnClickListener() {                         public void onClick(DialogInterface dialog, int whichButton) {                             // negative button clicked                             getActivityInstance().onCancelClicked(GeneralDialogFragment.this);                         }                     }                 )                 .create();         }      }   If you need to use your own custom layout for dialog,then inflate a layout in onCreateView and remove onCreateDialog . But Add the click listeners in onCreateView like i explained in onCreateDialog  
 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,                          Bundle savedInstanceState) {     View view = inflater.inflate(R.layout.activity_dialog, container, false);     return view; }   Then , In  your Activity need to implement an interface to handle the action in dialog
public class TryMeActivity extends      FragmentActivity implements GeneralDialogFragment.OnDialogFragmentClickListener {      @Override         public void onOkClicked(GeneralDialogFragment dialog) {                 // do your stuff         }          @Override         public void onCancelClicked(GeneralDialogFragment dialog) {                 // do your stuff         } }   Finally, Show the Dialog from your Activity when required, like this
    GeneralDialogFragment generalDialogFragment =         GeneralDialogFragment.newInstance("title", "message");     generalDialogFragment.show(getSupportFragmentManager(),"dialog");   Hope this helps. I am sure this approach is one of the optimized way, but there could be also different approaches .
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With