Reputation: 10000
I have an EditText inside an AlertDialog. It looks like this.
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
Upvotes: 50
Views: 23652
Reputation: 1
the margin values need to be set in px and if you want to use dp-values then dont forget to convert it to px.
editText.updateLayoutParams<FrameLayout.LayoutParams> {
this.leftMargin = 50
this.rightMargin = 50
}
Important! you need to update the layout params after setting the view in the AlertDialog
You can see it in this example:
val editText = EditText(this)
editText.setText("tddjdjck")
AlertDialog.Builder(this)
.setTitle("by...")
.setMessage("enter the name of the person who did:")
.setView(editText)
.setNegativeButton("Cancel"){ dialog, _ ->
dialog.cancel()
}.setPositiveButton("Ok"){ dialog, _ ->
//your execution
}.show()
editText.updateLayoutParams<FrameLayout.LayoutParams> {
this.leftMargin = 50
this.rightMargin = 50
}
Upvotes: 0
Reputation: 1
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);
Upvotes: 0
Reputation: 3131
I make a general single input AlertDialog function. The code is self-explanatory.
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() {
// ...
}
});
Upvotes: 2
Reputation: 777
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
Upvotes: 15
Reputation: 6109
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>
Upvotes: 105
Reputation: 4954
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);
Upvotes: 26