Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create a general class for custom Dialog in java Android

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

like image 460
danigonlinea Avatar asked May 01 '14 13:05

danigonlinea


1 Answers

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 .

like image 69
Libin Avatar answered Sep 24 '22 02:09

Libin