Java Can';t在AlertDialog内以编程方式更改EditText页边距
我的应用程序中有一个包含EditText字段的AlertDialog。此对话框需要以编程方式生成,并且应该与用户通过触摸EditTextPreference编辑文本时Android自动显示的EditTextPreference对话框的外观相匹配。这一切都是可行的,但以编程方式插入的EditText的大小太大,并且与触摸EditTextPreference时显示的大小不匹配。以下两幅图显示了该问题 EditText使用setView()添加到AlertDialog时如下所示: 但应如下所示: 以下是负责EditTextPreference的XML中的XML代码:Java Can';t在AlertDialog内以编程方式更改EditText页边距,java,android,android-layout,android-alertdialog,Java,Android,Android Layout,Android Alertdialog,我的应用程序中有一个包含EditText字段的AlertDialog。此对话框需要以编程方式生成,并且应该与用户通过触摸EditTextPreference编辑文本时Android自动显示的EditTextPreference对话框的外观相匹配。这一切都是可行的,但以编程方式插入的EditText的大小太大,并且与触摸EditTextPreference时显示的大小不匹配。以下两幅图显示了该问题 EditText使用setView()添加到AlertDialog时如下所示: 但应如下所示:
<EditTextPreference
android:title="Enter Name"
android:key="name"
android:defaultValue=""
android:summary=""
android:inputType="textCapSentences|textMultiLine"
android:singleLine="false"
android:gravity="top|left"
android:lines="2"
android:minLines="1"
android:maxLines="2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
/>
请按上述方式更改代码,并提供所需的所有页边距在执行此操作之前,您必须添加一个容器,例如
LinearLayout
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mainActivity);
alertDialog.setTitle("Enter Date");
LinearLayout container = new LinearLayout(this);
container.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(left, top, right, bottom);
final EditText input = new EditText(mainActivity);
input.setLayoutParams(lp);
input.setGravity(android.view.Gravity.TOP|android.view.Gravity.LEFT);
input.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES|InputType.TYPE_TEXT_FLAG_MULTI_LINE);
input.setLines(1);
input.setMaxLines(1);
input.setText(lastDateValue);
container.addView(input, lp);
alertDialog.setView(container);
我希望它能有所帮助:)您无需额外的容器布局即可完成此操作,只需将其添加到您的
警报对话框中即可:
alertDialog.setOnShowListener(dialog -> {
ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) editText.getLayoutParams();
p.setMargins(50, 20, 50, 20); // You can change the margins for your need
editText.requestLayout();
});
创建一个包含所需和格式化元素的Android XML。展开XML/视图并将视图添加到对话框按钮
这样,UI设计和代码就更清晰地分开了。带有预览功能的Android XML编辑器可以更轻松地获得想要的光学结果
该示例使用了数据绑定,因此XML/视图通过数据绑定对话框EditTextBinding.inflate([…])
处理,结果通过数据绑定对话框Binding.editText.getText().toString()
访问
片段/活动中的Java代码
用于对话框额外元素的Android XML
dialog\u edit\u text.xml
:
附言
PS:该示例由我的代码和您的代码组合而成,因此可能包含错误。基于@LeonardoSibela answer,我在kotlin中创建了这个简单的函数,用于显示一个带有edittext和回调的对话框
private fun showEditDialog(标题:String,前缀:String,onSubmit:(text:String)->Unit){
val editText=editText(requireContext())。应用{
setText(预填充)
}
val viewContainer=LinearLayout(requireContext())。应用{
方向=线性布局。垂直
val lp=LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_父级,
LinearLayout.LayoutParams.MATCH\u父项
).申请{
设置边距(16.dp,0,16.dp,0)
}
addView(编辑文本,lp)
}
MaterialAlertDialogBuilder(requireContext())
.setView(viewContainer)
.setTitle(标题)
.setPositiveButton(“确定”){{{,{->onSubmit(editText.text.toString())}
.setNegativeButton(“取消”){{},{->}
.show()
}
你可以这样使用它:
showEditDialog("Change name", "") { name ->
viewModel.updateName(name)
}
显示与AlertDialogy相关的xml文件和代码请编辑问题并向我们提供代码和xml布局file@AmitVaghela谢谢,我试过了,效果不错。然而,我担心硬编码的边距值不会匹配Android UI中未来的主题更改。有没有办法检索当前主题的默认边距值?谢谢,但我已经尝试过了。将LayoutParams直接添加到EditText似乎没有什么不同。根据Amit Vaghela的评论,也许先将编辑文本包装成线性布局就行了。然后你必须为AlertDialog膨胀自定义布局,幸运吗?谢谢!。它是helped@Madhu如果确实有用,你能接受正确答案吗?发布问题的人可以接受答案。我没有那种特权,我以为是你问的
alertDialog.setOnShowListener(dialog -> {
ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) editText.getLayoutParams();
p.setMargins(50, 20, 50, 20); // You can change the margins for your need
editText.requestLayout();
});
final DialogEditTextBinding dialogBinding = DialogEditTextBinding.inflate(getLayoutInflater());
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mainActivity);
alertDialog.setTitle("Enter Date");
alertDialog.setView(dialogBinding);
alertDialog.setPositiveButton("OK",
(dialog, whichButton) -> {
String editText = dialogBinding.editText.getText().toString();
doSomething(editText);
});
showEditDialog("Change name", "") { name ->
viewModel.updateName(name)
}