48

I have an EditText inside an AlertDialog. It looks like this.

enter image description here

See where it says tddjdjck and how it is indented quite a lot. That is what I want (I used setPadding with left and right set to 50), but I also want the blue line under it to be indented too. How do I do that?

The code I am using is below:

            final AlertDialog.Builder alert = new AlertDialog.Builder(thisActivity);
            final EditText input = new EditText(thisActivity);
            input.setSingleLine();
            input.setPadding(50, 0, 50, 0);

            alert.setTitle("by...");
            alert.setMessage("enter the name of the person who did:");
            alert.setView(input);
            alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    String value = input.getText().toString().trim();

                }
            });

            alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    dialog.cancel();
                }
            });
            alert.show();  

Thank you

b85411
  • 9,420
  • 15
  • 65
  • 119

5 Answers5

104
final AlertDialog.Builder alert = new AlertDialog.Builder(thisActivity);
final EditText input = new EditText(thisActivity);
input.setSingleLine();
FrameLayout container = new FrameLayout(thisActivity);
FrameLayout.LayoutParams params = new  FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.leftMargin = getResources().getDimensionPixelSize(R.dimen.dialog_margin);
input.setLayoutParams(params);
container.addView(input);
alert.setTitle("by...");
alert.setMessage("test message");
alert.setView(container);

Make sure you add another line to your dimens.xml resource file, such as

<dimen name="dialog_margin">20dp</dimen>
theczechsensation
  • 4,215
  • 2
  • 24
  • 25
Ashton Engberg
  • 5,949
  • 2
  • 19
  • 14
  • Unfortunately we have wrap the EditText in a FrameLayout since the builder obliterates the layoutparams of whatever is added via setView. Not such an expensive deal here, but view hierarchies should always be as flat as possible. – Ashton Engberg Jan 05 '15 at 09:51
  • 1
    Is there a better way than hardcoding the margin? Is there a like a style constant in R. so that the title margin and this margin always stay the same? – Phil Oct 19 '16 at 07:25
  • This did not work for me (with a `TextView` instead of a `EditText` ). The answer by Bhargav Thanki did work however. – Carsten Nov 25 '18 at 09:47
  • 1
    Crashes with "The specified child already has a parent. You must call removeView() on the child's parent first." – Johann Jun 27 '19 at 14:13
25

You can pass spacing parameter in setView method

alert.setView(view ,left_space , top_space , right_space , bottom_space);

So,in your case you can try this

alert.setView(input , 50 ,0, 50 , 0);
Bhargav Thanki
  • 4,924
  • 2
  • 37
  • 43
14

Here is Kotlin extension function for the Builder to set EditText view.

val Float.toPx: Int
get() = (this * Resources.getSystem().displayMetrics.density).toInt()

fun AlertDialog.Builder.setEditText(editText: EditText): AlertDialog.Builder {
    val container = FrameLayout(context)
    container.addView(editText)
    val containerParams = FrameLayout.LayoutParams(
            FrameLayout.LayoutParams.MATCH_PARENT,
            FrameLayout.LayoutParams.WRAP_CONTENT
    )
    val marginHorizontal = 48F
    val marginTop = 16F
    containerParams.topMargin = (marginTop / 2).toPx
    containerParams.leftMargin = marginHorizontal.toInt()
    containerParams.rightMargin = marginHorizontal.toInt()
    container.layoutParams = containerParams

    val superContainer = FrameLayout(context)
    superContainer.addView(container)

    setView(superContainer)

    return this
}

Usage example

val editText = EditText(this)
AlertDialog.Builder(this)
        .setTitle("Group Name")
        .setEditText(editText)
        .setPositiveButton("OK", { _: DialogInterface, _: Int ->
            // Do your work with text here
            val text = editText.text.toString()
            Toast.makeText(applicationContext, text, Toast.LENGTH_SHORT).show()
        })
        .setNegativeButton("Cancel", null)
        .show()

Result

enter image description here

Shubham AgaRwal
  • 4,355
  • 8
  • 41
  • 62
Vadim Ahmerov
  • 708
  • 9
  • 12
2

I make a general single input AlertDialog function. The code is self-explanatory.

enter image description here

Utils.java

public class Utils {

    /**
     * Convert dp to px value.
     * -
     * Source: https://stackoverflow.com/a/6327095/2263329
     */
    public static int dpToPx(float dp, Resources resources) {
        float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, resources.getDisplayMetrics());
        return (int) px;
    }

    /**
     * Show an AlertDialog with a single input box.
     *
     * @param context         Application context
     * @param title           Dialog title
     * @param message         Dialog input message/hint
     * @param inputType       InputType of EditText
     * @param positiveBtnText Dialog positive button text
     * @param negativeBtnText Dialog negative button text
     * @param listener        Dialog buttons click listener
     */
    public static void showSingleInputDialog(
            @NonNull Context context,
            @NonNull String title,
            @NonNull String message,
            int inputType,
            @NonNull String positiveBtnText,
            @NonNull String negativeBtnText,
            @NonNull final SingleInputDialogListener listener
    ) {
        AlertDialog.Builder alert = new AlertDialog.Builder(context);
        alert.setTitle(title);

        TextInputLayout textInputLayout = new TextInputLayout(context);

        final EditText input = new EditText(context);
        input.setSingleLine(true);
        input.setInputType(inputType);
        input.setHint(message);

        FrameLayout container = new FrameLayout(context);
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

        int left_margin = Utils.dpToPx(20, context.getResources());
        int top_margin = Utils.dpToPx(10, context.getResources());
        int right_margin = Utils.dpToPx(20, context.getResources());
        int bottom_margin = Utils.dpToPx(4, context.getResources());
        params.setMargins(left_margin, top_margin, right_margin, bottom_margin);

        textInputLayout.setLayoutParams(params);

        textInputLayout.addView(input);
        container.addView(textInputLayout);

        alert.setView(container);

        alert.setPositiveButton(positiveBtnText, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {

                listener.positiveCallback(input.getText().toString());

            }
        });

        alert.setNegativeButton(negativeBtnText,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {

                        listener.negativeCallback();

                    }
                });

        alert.show();
    }

}

SingleInputDialogListener.java

public interface SingleInputDialogListener {

    void positiveCallback(String inputText);

    void negativeCallback();

}

Use example:

Utils.showSingleInputDialog(mContext,
        "Password recovery",
        "Your e-mail address",
        InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS,
        "Recover",
        "Cancel",
        new SingleInputDialogListener() {
            @Override
            public void positiveCallback(String inputText) {

                Toast.makeText(mContext, inputText, Toast.LENGTH_SHORT).show();

            }

            @Override
            public void negativeCallback() {

                // ...

            }
        });
Mahmudul Hasan Shohag
  • 2,203
  • 1
  • 22
  • 30
0
        float paddingDp = 10f;
        int paddingPx = 5;


            paddingPx = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, 
                         paddingDp, activity.Resources.DisplayMetrics);
           //alert dialog
           adDialog.SetView(input, paddingPx, 5, paddingPx, 5);

try this below extension i did this For xamarin android ,i hope this will work for Java as well with little modifications

 public static AlertDialog ShowInputDialogue(this Activity activity, string title, string message, string txtValue, string dismissButtonText, string submitButtonText, Action<string> OnSubmit,bool TextInputType =false,bool isEdittable =true)
    {
        AlertDialog adDialog = null;
        try
        {
            adDialog = new AlertDialog.Builder(activity).Create();
            // Create TextView
            EditText input = new EditText(activity);
            input.ImeOptions = Android.Views.InputMethods.ImeAction.Done;
            input.Enabled = isEdittable;
            float paddingDp = 10f;
            int paddingPx = 5;
            if (!TextInputType)
            {
                input.SetBackgroundResource(Resource.Color.edit_text_shape);
                input.InputType = Android.Text.InputTypes.ClassNumber | Android.Text.InputTypes.NumberFlagDecimal;
                input.Text = txtValue;
                //input.SetMaxLines(5);
                //input.SetLines(5);
            }
            else
            {
                input.SetBackgroundResource(Resource.Color.edit_text_shape);

                // Convert to pixels
                paddingPx = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, paddingDp, activity.Resources.DisplayMetrics);
                input.SetPadding(paddingPx, paddingPx, paddingPx, paddingPx);

                input.Text = txtValue;
                input.SetMaxLines(5);
                input.SetLines(5);
            }
            //input.FocusChange += (object sender, View.FocusChangeEventArgs e) =>
            //{
            //    // request a soft keyboard.
            //    InputMethodManager imm = (InputMethodManager)activity.GetSystemService(Context.InputMethodService);
            //    if (e.HasFocus)
            //        imm.ToggleSoftInput(ShowFlags.Forced, HideSoftInputFlags.None);
            //};


            input.EditorAction += (s, e) =>
            {
                if (e.ActionId == ImeAction.Done)
                {
                    adDialog.Hide();
                    adDialog.Cancel();

                    if (OnSubmit != null)
                        OnSubmit(input.Text);


                }

            };


            //adDialog.Window.ClearFlags(WindowManagerFlags.NotFocusable | WindowManagerFlags.AltFocusableIm);
            adDialog.SetTitle(title);
            adDialog.SetMessage(message);
            adDialog.SetView(input, paddingPx, 5, paddingPx, 5);
            adDialog.SetButton(dismissButtonText, new EventHandler<DialogClickEventArgs>(
                (s, args) =>
                {
                    adDialog.Hide();
                    adDialog.Cancel();

                    View view = adDialog.CurrentFocus;
                    if (view != null)
                    {
                        InputMethodManager imm = (InputMethodManager)activity.GetSystemService(Context.InputMethodService);
                        imm.HideSoftInputFromWindow(view.WindowToken, HideSoftInputFlags.None);
                    }
                }));
            adDialog.SetButton2(submitButtonText, new EventHandler<DialogClickEventArgs>(
                (s, args) =>
                {
                    if (OnSubmit != null)
                        OnSubmit(input.Text);

                    View view = adDialog.CurrentFocus;
                    if (view != null)
                    {
                        InputMethodManager imm = (InputMethodManager)activity.GetSystemService(Context.InputMethodService);
                        imm.HideSoftInputFromWindow(view.WindowToken, HideSoftInputFlags.None);
                    }
                }));
            adDialog.Window.Attributes.WindowAnimations = Resource.Style.DialogAnimation_2;

            adDialog.Show();
            //input.RequestFocus();
            SetDialogueTheme(activity, adDialog);
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return adDialog;
    }

Usage in activity:

   this.ShowInputDialogue("Title", "", "editetext notes", "Cancel", "Save", async (val) =>
                        {
                        try
                        {
                         //handle for save

                        }
                        catch (Exception ex)
                        {
                          
                        }
                    }, true);