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 帮助修复自定义警报对话框的主要内容,如果未能解决你的问题,请参考以下文章

android-edittext键盘不显示

Android EditText 删除(退格)键事件

使用kotlin从android中的BroadcastReceiver类访问edittext

Android edittext - settextmethod 光标问题

从android中动态创建的edittext获取价值?

android怎么让EditText弹出的默认是字母键盘呢