在Android AlertDialog中为EditText添加更大的边距

49

我在AlertDialog里面有一个EditText,它看起来像这样。

enter image description here

你可以看到“tddjdjck”那一行被缩进了很多,我想达到这个效果(我使用了setPadding,将左右设置为50),但我也希望下面的蓝线也能够向右缩进。我该怎么办?

我正在使用以下代码:

            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();  

谢谢你


1
请使用layout_margin从左侧和右侧进行布局,而不是填充。 - Pramod Yadav
像这样做。settext("你的文本 \n\n"). 简单而且有效。 - Tushar Gogna
我可以使用哪个函数来设置layout_margin? - b85411
5个回答

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);

请确保在dimens.xml资源文件中添加另一行,例如:

请确保在dimens.xml资源文件中添加其他行,例如

<dimen name="dialog_margin">20dp</dimen>

谢谢,问题已解决。 - b85411
不幸的是,由于构建器会抹掉通过setView添加的任何视图的layoutparams,所以我们必须将EditText包装在FrameLayout中。虽然在这里并不算太昂贵,但视图层次结构应尽可能保持扁平。 - Ashton Engberg
1
有没有比硬编码边距更好的方法?在R中是否有类似于样式常量的东西,以便标题边距和此边距始终保持相同? - Phil
这对我没有起作用(使用TextView而不是EditText)。但Bhargav Thanki的答案确实有效。 - Carsten
1
崩溃并显示“指定的子项已经有一个父项。您必须先调用removeView()方法来移除该子项的父项。” - Johann

25

您可以在setView方法中传递间距参数。

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

那么,在您的情况下,您可以尝试这个

alert.setView(input , 50 ,0, 50 , 0);

24
对于较新的API,这已经被弃用了。 - jbrulmans
5
但是它仍然可以正常工作,而不需要添加一打额外的代码行。 - Bolein95
我的构建器只接受一个参数用于 setView() - phuwin
8
仅 Builder 中的方法已被弃用。AlertDialog 中的方法似乎并未被弃用,并可实现相同的效果(在 builder 上调用 .create() 后调用)。 - Carsten

14

这是一个Kotlin扩展函数,用于设置EditText视图的Builder。

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
}

使用示例

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()

结果

输入图像描述


2
我创建了一个通用的单输入AlertDialog函数。代码是自解释的。

enter image description here

Utils.java

public class Utils {

    /**
     * Convert dp to px value.
     * -
     * Source: https://dev59.com/MW445IYBdhLWcg3w_O8m#6327095
     */
    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();

}

使用示例:

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() {

                // ...

            }
        });

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);

尝试使用以下扩展程序 我已经为Xamarin Android完成了这个,希望在Java中进行一些小修改后也能起作用

 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;
    }

在活动中的使用:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接