Android- Help fixing Custom Alert Dialog with Edit

2019-07-22 07:55发布

问题:

Context: There is a custom Listview and each list item has a button in it. When you click the button an alertDialog appears with an edit text and submit button. This only happens on the first click, on subsequent clicks a Toast will simply appear with the number of times it has been clicked thus far.

When you click the submit button a toast will appear displaying the text that was entered into the editText and the number of times they have clicked on it which will presumably always be 1 since this can only happen on the first click.

Problem: The timesClicked counter is not working properly if the user so much as clicks on the editText before clicking submit. It is restting to 0 I guess. However if the user does not click on the editText then the program works normally. 0_o I'm at a loss.

Attempts at solving: I simplified the code down quite a bit to try and pinpoint the problem and this is where I am stuck. Originally I was inflating a view that only had an edit text and then I was just using builder.setPositiveButtton. I thought implementing the buttons directly in the view would fix it but that doesn't seem to be the case. I have been stuck on this for awhile. Any help would be great

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

回答1:

You can make class that extend Dialog.

example:

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

You can use this dialog..

mCustomDialog = new CustomDialog();
mCustomDialog.show();

You can make the layout as you wish.

======================================================================

You can use AlertDialog.Builder.setPositiveButton.

site : setPositiveButton

example...

 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


回答2:

I found the solution. Basically what was happening was that when the Keyboard appeared it would cause the listview to adjust the size recreating the whole listview with recycled/old versions of the list items from before the dialog appeared -effectively undoing any changes made to the ListView items by the dialog.

In your listview XML add this:

android:descendantFocusability="beforeDescendants"

In Mainfest.xml:

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