cosmicsafari
cosmicsafari

Reputation: 4049

Android: Creating a custom alert dialog inside a dynamic onclicklistener

Not sure how well that title describes what I am hoping to do but here goes. Basically I have an app that pragmatically creates a list of buttons which when clicked then return a description.

I created the following class

public class DynamicOnClickListener implements OnClickListener
{

    String description;
    public DynamicOnClickListener(String adesc) {
        //sets the description attribute at instantiation
         this.description = adesc;
    }

    public void onClick(View v) {
        //on button click returns dialog box with description in it
        Log.v("DynamicOnClickListener","1");
        AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
        builder.setMessage(description);
        builder.setCancelable(false);
        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) 
                   {
                       dialog.cancel();
                   }
               });
        AlertDialog alert = builder.create();   
        alert.show();
    }

 }

This works perfectly as is, however I would very much like to jazz up the dialog box somewhat. I have been looking at some examples online and according to the android docs they suggest defining a custom xml layout and using LayourInflator set the custom xml as the view for the dialog. (Well thats how I understood it anyway, probably wrongly right enough)

Although the docs example is slightly different from mine, according to their example I should add the following lines

// Get the layout inflater
LayoutInflater inflater = getActivity().getLayoutInflater();

// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
builder.setView(inflater.inflate(R.layout.dialog_signin, null))

However when I add this to my class, resulting in the following I get an error on getActivity()

public class DynamicOnClickListener implements OnClickListener
{

    String description;
    public DynamicOnClickListener(String adesc) {
        //sets the description attribute at instantiation
         this.description = adesc;
    }

    public void onClick(View v) {
        //on button click returns dialog box with program description in it
        Log.v("DynamicOnClickListener","1");
        AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());

        // Get the layout inflater
        LayoutInflater inflater = getActivity().getLayoutInflater();

        // Inflate and set the layout for the dialog
        // Pass null as the parent view because its going in the dialog layout
        builder.setView(inflater.inflate(R.layout.description_dialog, null));


        builder.setMessage(description);
        builder.setCancelable(false);
        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) 
                   {
                       dialog.cancel();
                   }
               });
        AlertDialog alert = builder.create();   
        alert.show();
    }

 }

Upvotes: 1

Views: 3675

Answers (3)

Yavuz Erzurumlu
Yavuz Erzurumlu

Reputation: 31

According to CoderDecoder and kleopatra's answers here is the updated version with a shape.

    final Dialog dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

    GradientDrawable shape = new GradientDrawable();
    shape.setColor(getResources().getColor(R.color.shape_client_textview_background_color));
    shape.setStroke(10, getResources().getColor(R.color.shape_client_textview_border_color));
    shape.setCornerRadius(50);

    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
    LinearLayout popUp = new LinearLayout(this);
   // popUp.setBackgroundColor(Color.LTGRAY);
    layoutParams.setMargins(20,20,20,20);
    popUp.setOrientation(LinearLayout.VERTICAL);
    popUp.setLayoutParams(layoutParams);
    popUp.setBackground(shape);
    popUp.setPadding(20,20,20,20);

    EditText t1 = new EditText(this);
    t1.setHint("Enter Your Email ID ");
    t1.setTextColor(Color.parseColor("#FFFFFF"));
    t1.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);

    LinearLayout btnLayout = new LinearLayout(this);
 //   btnLayout.setBackgroundColor(Color.LTGRAY);
    btnLayout.setOrientation(LinearLayout.HORIZONTAL);
    btnLayout.setGravity(Gravity.CENTER);

    Button send = new Button(this);
    send.setText("Send");
    send.setTextColor(Color.WHITE);
    Button cancel = new Button(this);
    cancel.setText("Cancel");
    cancel.setTextColor(Color.WHITE);

    btnLayout.addView(send);
    btnLayout.addView(cancel);
    popUp.addView(t1);
    popUp.addView(btnLayout);

    dialog.setContentView(popUp);
    cancel.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            dialog.dismiss();
        }
    });

    dialog.show();

Here is the result:

Dynamic dialog with a shape

Upvotes: 1

CoderDecoder
CoderDecoder

Reputation: 445

I did the dialogue box with an EditText to enter email and a button to send the data and to cancel it.. This dialogue box is shown by making the background dim. And displaying it on top of the current activity.

    final Dialog dialog = new Dialog(this);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
               LinearLayout popUp = new LinearLayout(this);
               popUp.setBackgroundColor(Color.LTGRAY);
               popUp.setOrientation(1);

                EditText t1 = new  EditText(this);
                t1.setHint("Enter Your Email ID ");
                t1.setTextColor(Color.parseColor("#FFFFFF"));
                t1.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);          

                LinearLayout btnLayout = new LinearLayout(this);
                btnLayout.setBackgroundColor(Color.LTGRAY);
                btnLayout.setOrientation(0);
                btnLayout.setGravity(Gravity.CENTER);

                Button send = new  Button(this);
                send.setText("Send");
                send.setTextColor(Color.WHITE);
                Button cancel = new  Button(this);
                cancel.setText("Cancel");
                cancel.setTextColor(Color.WHITE);

                btnLayout.addView(send);
                btnLayout.addView(cancel);
                popUp.addView(t1);
                popUp.addView(btnLayout);

                dialog.setContentView(popUp);
              cancel.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    dialog.dismiss();
                }
            });
                dialog.show();

Upvotes: 3

Triode
Triode

Reputation: 11359

final Context mContext = v.getContext()
inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
builder.setView(inflater.inflate(R.layout.description_dialog, null));

Try this.

Upvotes: 2

Related Questions