Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';t在AlertDialog内以编程方式更改EditText页边距_Java_Android_Android Layout_Android Alertdialog - Fatal编程技术网

Java Can';t在AlertDialog内以编程方式更改EditText页边距

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时如下所示: 但应如下所示:

我的应用程序中有一个包含EditText字段的AlertDialog。此对话框需要以编程方式生成,并且应该与用户通过触摸EditTextPreference编辑文本时Android自动显示的EditTextPreference对话框的外观相匹配。这一切都是可行的,但以编程方式插入的EditText的大小太大,并且与触摸EditTextPreference时显示的大小不匹配。以下两幅图显示了该问题

EditText使用setView()添加到AlertDialog时如下所示:

但应如下所示:

以下是负责EditTextPreference的XML中的XML代码:

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