Android- 使用 EditText 帮助修复自定义警报对话框
Posted
技术标签:
【中文标题】Android- 使用 EditText 帮助修复自定义警报对话框【英文标题】:Android- Help fixing Custom Alert Dialog with EditText 【发布时间】:2017-01-05 22:47:56 【问题描述】:上下文:有一个自定义的 Listview,每个列表项都有一个按钮。当您单击该按钮时,将出现一个带有编辑文本和提交按钮的 alertDialog。这只会在第一次点击时发生,在随后的点击中,Toast 将简单地显示到目前为止它被点击的次数。
当您单击提交按钮时,将出现一个 toast,显示输入到 editText 中的文本以及他们点击它的次数,因为这只会发生在第一次点击时。
p>问题:如果用户在点击提交之前点击了editText,则timesClicked 计数器无法正常工作。我猜它正在休息到0。但是,如果用户不单击editText,则程序正常工作。 0_o 我很茫然。
解决问题的尝试:我将代码简化了很多,试图找出问题所在,这就是我卡住的地方。最初我正在膨胀一个只有编辑文本的视图,然后我只是使用 builder.setPositiveButton。我认为直接在视图中实现按钮会修复它,但似乎并非如此。我已经坚持了一段时间。任何帮助都会很棒
Here is a video of the bug happening
private class OnSubtractClickListener implements View.OnClickListener
final int id; //id of list item that was clicked
int timesClicked;
Toast toast;
public OnSubtractClickListener(int id, View view)
super();
this.id = id;
timesClicked = 0;
@Override
public void onClick(View view)
if (timesClicked != 0)
toast.setText(Integer.toString(timesClicked));
toast.show();
else
toast = Toast.makeText(view.getContext(), "", Toast.LENGTH_SHORT);
final View dialogView = LayoutInflater.from(view.getContext()).inflate(R.layout.dialog_add_notes, null);
AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
builder.setView(dialogView);
builder.setTitle("Subtract cigar?");
builder.setIcon(R.mipmap.monkey_launcher);
final AlertDialog dialog = builder.create();
Button yesButton = (Button)dialogView.findViewById(R.id.dialog_notes_yes_button);
yesButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
EditText editText = (EditText)dialogView.findViewById(R.id.dialog_editText);
String userInput = editText.getText().toString();
String timesClickedString = Integer.toString(++timesClicked);
toast.setText(timesClickedString + ": " + userInput);
toast.show();
dialog.dismiss();
);
dialog.show(); //new
【问题讨论】:
为了使点击次数回到 0,您必须在某处重新创建点击侦听器。你能在你的代码中显示你在哪里设置点击监听器吗? 只有当用户点击对话框中的editText时它才会被重置。否则它工作正常。我在 customlistAdapter 的 bindView 中设置它 没有人知道问题所在?在我的应用程序中,正在调用数据库并正在更新列表视图。但随后列表视图实际上恢复到以前的状态。但是数据库已经更新。没有意义。有什么可以取消对列表视图项的更改 什么时候创建OnSubtractClickListener
的实例?
在自定义游标适配器的绑定视图中
【参考方案1】:
您可以制作扩展 Dialog 的类。
示例:
public class CustomDialog extends Dialog
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
WindowManager.LayoutParams lpWindow = new WindowManager.LayoutParams();
lpWindow.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
lpWindow.dimAmount = 0.8f;
getWindow().setAttributes(lpWindow);
setContentView(R.layout.activity_custom_dialog);
editText = (EditText) findViewById(R.id.editText);
您可以使用此对话框..
mCustomDialog = new CustomDialog();
mCustomDialog.show();
您可以根据需要进行布局。
================================================ ========================
您可以使用 AlertDialog.Builder.setPositiveButton。
网站:setPositiveButton
例子...
toast = Toast.makeText(view.getContext(), "", Toast.LENGTH_SHORT);
final View dialogView = LayoutInflater.from(view.getContext()).inflate(R.layout.dialog_add_notes, null);
AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
builder.setView(dialogView);
builder.setTitle("Subtract cigar?");
builder.setIcon(R.mipmap.monkey_launcher);
builder.setPositiveButton("text", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialogInterface, int which)
EditText editText = (EditText)dialogView.findViewById(R.id.dialog_editText);
String userInput = editText.getText().toString();
String timesClickedString = Integer.toString(++timesClicked);
toast.setText(timesClickedString + ": " + userInput);
toast.show();
);
final AlertDialog dialog = builder.create();
dialog.show(); //new
【讨论】:
感谢您的尝试,但这不是我想要的。在对话框中创建 editText 没有问题。那部分很容易。我的问题是,当用户单击 editText 并出现虚拟键盘时。对话框关闭后对 listView 所做的任何更改。已重置。 再次感谢您的尝试,但问题不在于使用 editText 创建对话框。我发现了问题所在,并提出了一个解决方案,我将在今晚晚些时候发布。基本上发生的事情是,当键盘出现时,它会导致列表视图调整大小,从对话框出现之前使用重新循环/旧版本的列表项重新创建整个列表视图 - 有效地撤消对话框对 ListView 项目所做的任何更改.【参考方案2】:我找到了解决方案。基本上发生的事情是,当键盘出现时,它会导致列表视图调整大小,从对话框出现之前使用回收/旧版本的列表项重新创建整个列表视图 - 有效地撤消对话框对 ListView 项目所做的任何更改.
在您的列表视图 XML 中添加:
android:descendantFocusability="beforeDescendants"
在 Mainfest.xml 中:
<activity android:name= ".yourActivity"
android:windowSoftInputMode="adjustPan"/>
【讨论】:
以上是关于Android- 使用 EditText 帮助修复自定义警报对话框的主要内容,如果未能解决你的问题,请参考以下文章
使用kotlin从android中的BroadcastReceiver类访问edittext