Android-使用EditText帮助修复自定义警报对话框

时间:2016-08-29 19:53:04

标签: android listview android-edittext android-alertdialog customdialog

上下文:有一个自定义Listview,每个列表项都有一个按钮。单击该按钮时,会出现一个带有编辑文本和提交按钮的alertDialog。这仅在第一次点击时发生,在随后的点击中,Toast将仅显示到目前为止点击的次数。

当您单击提交按钮时,将出现一个toast,显示输入editText的文本以及他们点击它的次数,这可能总是为1,因为这只能在第一次点击时发生。

问题:如果用户在点击提交之前点击editText,则timesClicked计数器无法正常工作。我猜它正在休息到0。但是,如果用户单击editText,则程序正常工作。 0_o我不知所措。

尝试解决:我将代码简化了一点,试图找出问题,这就是我被困住的地方。最初我正在膨胀一个只有编辑文本的视图然后我只是使用builder.setPositiveButtton。我认为直接在视图中实现按钮会修复它但看起来并非如此。我被困在这一段时间了。任何帮助都会很棒

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

2 个答案:

答案 0 :(得分:0)

< p>您可以创建扩展Dialog的类。< / p> < p为H.例如:< / p为H. < pre>< code>公共类CustomDialog extends Dialog {   private EditText editText;   @覆盖   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);   } } < /代码>< /预> < p>您可以使用此对话框。< / p> < pre>< code> mCustomDialog = new CustomDialog(); mCustomDialog.show(); < /代码>< /预> < p>您可以根据需要进行布局。< / p> < p为H. ============================================== ========================< / p为H. < p>您可以使用AlertDialog.Builder.setPositiveButton。< / p> < p> site:< a href =“https://developer.android.com/reference/android/support/v7/app/AlertDialog.Builder.html#setPositiveButton(int,%20android.content.DialogInterface.OnClickListener )“rel =”nofollow“> setPositiveButton< / a>< / p> < p为H.示例...< / p为H. <预><代码> 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(“减去雪茄?”);         builder.setIcon(R.mipmap.monkey_launcher);         builder.setPositiveButton(“text”,new DialogInterface.OnClickListener(){             @覆盖             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(); //新 < /代码>< /预>

答案 1 :(得分:0)

我找到了解决方案。基本上发生的事情是,当键盘出现时,它会导致listview调整大小,在对话框出现之前使用回收/旧版本的列表项重新创建整个列表视图 - 有效地撤消对话框对ListView项所做的任何更改

在listview XML中添加:

机器人:descendantFocusability =" beforeDescendants"

在Mainfest.xml中:

<activity android:name= ".yourActivity"      
android:windowSoftInputMode="adjustPan"/>