Mam następujący kod i tylko chcesz, aby mój przycisk był zamknięty, jeśli spełniony jest jakiś warunek, w przeciwnym razie chcę, aby pozostać otwarty z tymi samymi danymi:

  protected void showInputDialog() {

        final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
        LayoutInflater inflater = this.getLayoutInflater();
        final View dialogView = inflater.inflate(R.layout.phrase_input_layout, null);
        dialogBuilder.setView(dialogView);

        dialogBuilder.setTitle("Create new phrase flashcard");
        dialogBuilder.setPositiveButton("Done", (dialog, whichButton) -> {
            SubmissionState state = addCardToDocument(dialogView);
            if (state == SubmissionState.SUBMITTED_WITH_RESULTS_FOUND){
                dialog.dismiss();
            } else {
                // still stay open here, but it still closes...
            }
        });
        dialogBuilder.setNegativeButton("Cancel", (dialog, whichButton) -> Log.d("DEBUG", "Cancelled creating new phrase card."));
        AlertDialog b = dialogBuilder.create();
        b.show();
    }

Jednak wydaje się, że nie ma znaczenia, kiedy naciśnięcie przycisku pozytywny, dialogiowódę będzie zamknąć, niezależnie od tego, czy trafi do instrukcji, czy nie; Ponadto, nawet jeśli komentuję cały kod dla setPositiveButton Nadal odrzuci okno dialogowe!

Co ja robię źle?

Jeśli jest istotne, tutaj jest mój phrase_input_layout

<TextView
    android:id="@+id/phrase_translate_radio_group_header"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="4dp"
    android:layout_marginLeft="14dp"
    android:layout_marginBottom="4dp"
    android:text="@string/select_translation_mode"
    android:textAppearance="@style/TextAppearance.AppCompat.Body2" />

<RadioGroup
    android:id="@+id/phrase_translate_radio_group"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <RadioButton
        android:id="@+id/phrase_manual_translation"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="@string/manual_translation" />

    <RadioButton
        android:id="@+id/eng_auto_translation"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="@string/english_auto_translation" />

    <RadioButton
        android:id="@+id/swe_auto_translation"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="@string/swedish_auto_translation" />
</RadioGroup>

<EditText
    android:id="@+id/englishPhrase"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:layout_marginLeft="4dp"
    android:layout_marginRight="4dp"
    android:layout_marginBottom="4dp"
    android:hint="@string/english_phrase" />

<EditText
    android:id="@+id/swedishPhrase"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:layout_marginLeft="4dp"
    android:layout_marginRight="4dp"
    android:layout_marginBottom="4dp"
    android:hint="@string/swedish_phrase" />
</LinearLayout>
0
mr nooby noob 17 październik 2020, 20:34

1 odpowiedź

Najlepsza odpowiedź

Nie możesz tego zrobić za pomocą metody dostarczonej {X0}}. Jeśli ustawisz słuchacz za pomocą tej metody, a następnie za każdym razem, gdy przycisk zostanie kliknięty, słuchacz jest wywoływany, a następnie okno dialogowe zostanie zwolnione. Nie widzę sposobu na zastąpienie tego zachowania jako AlertDialog wewnętrznie używa obiektu AlertController, który realizuje to zachowanie.

Co możesz zrobić, to używać niestandardowych przycisków zamiast domyślnych.

Na przykład można dodać dwa przyciski na dole phrase_input_layout XML.

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <Button
        android:id="@+id/negativeButton"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <View
        android:id="@+id/buttonSeparator"
        android:layout_width="1dp"
        android:layout_height="match_parent"
        android:background="@color/separator" />

    <Button
        android:id="@+id/positiveButton"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />
</LinearLayout>

Ustaw słuchacze dla tych przycisków. Jak więc:

AlertDialog dialog;
protected void showInputDialog() {
    final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
    LayoutInflater inflater = this.getLayoutInflater();
    
    final View dialogView = inflater.inflate(R.layout.phrase_input_layout, null);
    dialogBuilder.setView(dialogView);

    dialogBuilder.setTitle("Create new phrase flashcard");
    
    Button positiveButton = (Button) dialogView.findViewById(R.id.positiveButton);
    Button negativeButton = (Button) dialogView.findViewById(R.id.negativeButton);

    positiveButton.setText("Create new phrase flashcard");
    positiveButton.setOnClickListener(view -> {
        SubmissionState state = addCardToDocument(dialogView);
            if (state == SubmissionState.SUBMITTED_WITH_RESULTS_FOUND){
                dialog.dismiss();
            } else {
            }
    });

    negativeButton.setText("Cancel");
    negativeButton.setOnClickListener(view -> {
        dialog.dismiss()
    });

    dialog = dialogBuilder.create();
    dialog.show();
}
1
Keyser Söze 17 październik 2020, 18:41