Як відключити / включити діалогові негативні позитивні кнопки?


111

Перегляньте спеціальне діалогове вікно нижче. У діалоговому вікні є поле редагування, і якщо текстове поле порожнє, я б хотів відключити positiveButton. Я можу отримати charListener для текстового поля, але я не впевнений, як мені встановити positivebuttonвідключення або включення цього слухача? Що стосується позитивних та негативних кнопок?

 case DIALOG_TEXT_ENTRY:
    // This example shows how to add a custom layout to an AlertDialog
    LayoutInflater factory = LayoutInflater.from(this);
    final View textEntryView = factory.inflate(R.layout.alert_dialog_text_entry, null);
    return new AlertDialog.Builder(AlertDialogSamples.this)
        .setIconAttribute(android.R.attr.alertDialogIcon)
        .setTitle(R.string.alert_dialog_text_entry)
        .setView(textEntryView)
        .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                /* User clicked OK so do some stuff */
            }
        })
        .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                /* User clicked cancel so do some stuff */
            }
        })
        .create();
}

Я думаю , що ця відповідь відповідає на ваше запитання [ stackoverflow.com/questions/4291548 / ... [1]: stackoverflow.com/questions/4291548 / ...
Олександр Kulyakhtin

дякую, але це не відповідь. це може допомогти, хоча. оскільки він відключає кнопку після натискання самого себе. що не те, що я хочу. Я хотів би показати, що він відключений залежить від текстового поля.
акд

1
if (editTextEmailAddress.getText (). toString (). length () == 0)
SALMAN

В основному ви створюєте об'єкт з анонімною посиланням, як тільки він створений, ви більше не можете посилатися на нього. Дякую.
САЛМАН

Відповіді:


207

Редагувати для повного рішення ...

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setTitle("Alert dialog title");
builder.setMessage("This is the example code snippet to disable button if edittext attached to dialog is empty.");
builder.setPositiveButton("PositiveButton",
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
                // DO TASK
            }
        });
builder.setNegativeButton("NegativeButton",
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
                // DO TASK
            }
        });

// Set `EditText` to `dialog`. You can add `EditText` from `xml` too.
final EditText input = new EditText(MainActivity.this);

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT,
        LinearLayout.LayoutParams.MATCH_PARENT
);
input.setLayoutParams(lp);


builder.setView(input);

final AlertDialog dialog = builder.create();
dialog.show();

// Initially disable the button
((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);

// OR you can use here setOnShowListener to disable button at first time.

// Now set the textchange listener for edittext
input.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    @Override
    public void afterTextChanged(Editable s) {

        // Check if edittext is empty
        if (TextUtils.isEmpty(s)) {
            // Disable ok button
            ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);

        } else {
            // Something into edit text. Enable the button.
            ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
        }

    }
});

Нижче відредагована історія, яку можна посилатись як детальніше

Ось зразок коду, спробуйте це

AlertDialog.Builder builder = new AlertDialog.Builder(AddSchedule.this);
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setTitle("Alert dialog title");
builder.setMessage("Dialog message");
builder.setPositiveButton("Button1", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface arg0, int arg1) {
        //DO TASK
    }
});
builder.setNegativeButton("Button2", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface arg0, int arg1) {
        //DO TASK
    }
});

AlertDialog dialog = builder.create();
dialog.show();

// After calling show method, you need to check your condition and enable/disable the dialog buttons 
if (your_condition_true) {
    // BUTTON1 is the positive button
    dialog.getButton(AlertDialog.BUTTON1).setEnabled(false);
}

Для негативної кнопки

dialog.getButton(AlertDialog.BUTTON2).setEnabled(false); //BUTTON2 is negative button

Для ідентифікатора кнопок : Довідка alar_dialog.xml

Відредаговано:

І setOnShowListener з API рівня 8 (FroYo) робить те саме,

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setPositiveButton(android.R.string.ok, null);

AlertDialog dialog = builder.create();
dialog.setOnShowListener(new OnShowListener() {

    @Override
    public void onShow(DialogInterface dialog) {
        if (condition) {
            ((AlertDialog)dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
        }
    }
});

dialog.show();

Відредаговано

new AlertDialog.Builder(this)
    .setMessage("This may take a while")
    .setPositiveButton("OK", new android.content.DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            ((AlertDialog)dialog).getButton(which).setVisibility(View.INVISIBLE);
            // the rest of your stuff
        }

    }).show();


виправте мене, якщо я помиляюся, але коли ви знову зателефонували до AlertDialog, це знову викликається його об'єктом або все-таки він використовує той самий. Я не знаю цього методу .поясниш коротко? Дякую :)
NovusMobile

Для скиммерів я хотів би додати, що dialog.getButton () працює лише для AlertDialogs, тому вам, можливо, доведеться перенести діалогове вікно в AlertDialog, як це робити далі в публікації.
Номенон

не працює - також я читаю код щонайменше 5 разів, і все ще не має сенсу, чому він повинен працювати :) Правильна відповідь наведена нижче від Ніка Палмера
qkx

@qkx Чи можете ви пояснити, що ви намагаєтеся зробити. Чи можете ви показати відповідний код? І не будьте іронічними і не піддайтеся.
Панкай Кумар

1
Я не хотів бути іронічним, грубим. Також я спробував зняти звук, але це неможливо ... Однак ще раз до проблеми - де ти маєш слухач тексту у своєму коді, ти можеш мені сказати? Не має значення, якою є умова, якщо вона викликається лише один раз. Якщо у вас немає такого слухача тексту, як Нік нижче, просто неможливо, щоб ваше рішення працювало ... Або я щось пропустив. Або надішліть мені якийсь простий андроїд-проект, щоб довести, що він працює;)
qkx

25

Жодна з цих відповідей справді не вирішує проблему.

Я досягаю цього за допомогою користувацького макета, у якому є EditText і TextWatcher у цьому поданні.

final LinearLayout layout = (LinearLayout) inflator.inflate(R.layout.text_dialog, null);
final EditText text = (EditText) layout.findViewById(R.id.text_edit);
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(layout);
// Now add the buttons...
builder.setPositiveButton(R.string.ok, new AlertDialog.OnClickListener() {
    // Left out for brevity...
}
builder.setNegativeButton(R.string.cancel, new AlertDialog.OnClickListener() {
    // Left out for brevity...
}

// Create the dialog
final AlertDialog d = builder.create();

// Now add a TextWatcher that will handle enable/disable of save button
text.addTextChangedListener(new TextWatcher() {
    private void handleText() {
        // Grab the button
        final Button okButton = d.getButton(AlertDialog.BUTTON_POSITIVE);
        if(text.getText().length() == 0) {
            okButton.setEnabled(false);
        } else {
            okButton.setEnabled(true);
        }
    }
    @Override
    public void afterTextChanged(Editable arg0) {
        handleText();
    }
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // Nothing to do
    }
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
       // Nothing to do
    }
});

// show the dialog
d.show();
// and disable the button to start with
d.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);

Ця відповідь неповна, немає декларації проd
androidguy

Відредаговано, щоб додати будівництво d.
Нік Палмер

4

Ось повний код для включення та відключення позитивної кнопки діалогового вікна:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater layoutInflater = MainActivity.this.getLayoutInflater();
View view = layoutInflater.inflate(R.layout.dialog,null);

builder.setView(view);
builder.setTitle("Test");
builder.setPositiveButton("ok", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        Toast.makeText(MainActivity.this, "Ok clicked", Toast.LENGTH_SHORT).show();
        dialog.dismiss();
    }
});
builder.setNegativeButton("cancel", null);

final AlertDialog alertDialog = builder.create();

alertDialog.show();

EditText editText = (EditText)view.findViewById(R.id.mobile_number);
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {}

    @Override
    public void afterTextChanged(Editable s) {
        if (s.length() >= 1) {
            alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
        } else {
            alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);

        }
    }
});

1

Ви можете записати слухача в текстове поле для редагування та спробувати включити або відключити кнопки. Це зразок коду для ксамарину.

var dialog = builder.Create();

dialog.Show();

var btnOk = dialog.GetButton((int)DialogButtonType.Positive).Enabled = false;

_enterTextDialogEditText.AfterTextChanged += (sender, e) => {
  if (!string.IsNullOrEmpty(_enterTextDialogEditText.Text)) {
    dialog.GetButton((int)DialogButtonType.Positive).Enabled = true;
  } else {
    dialog.GetButton((int)DialogButtonType.Positive).Enabled = false;
  }
};

0

Для видалення запису зі списку баз даних за допомогою власника перегляду ви використовували цей код у своєму методі getview ().

viewHolder.btn.setOnClickListener (новий OnClickListener () {

                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    AlertDialog.Builder alertDialog2 = new AlertDialog.Builder(
                            Favorate.this.getParent());

                    // Setting Dialog Title
                    alertDialog2.setTitle("Confirm Delete...");

                    // Setting Dialog Message
                    alertDialog2
                            .setMessage("Are you sure you want delete ?");

                    // Setting Icon to Dialog
                    alertDialog2.setIcon(R.drawable.delete);

                    // Setting Positive "Yes" Btn
                    alertDialog2.setPositiveButton("YES",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int which) {
                                    // Write your code here to execute after
                                    // dialog

                                    int id = _items.get(position).id;
                                    db.deleterecord(id);

                                    db.close();
                                }
                            });
                    // Setting Negative "NO" Btn
                    alertDialog2.setNegativeButton("NO",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int which) {
                                    // Write your code here to execute after
                                    // dialog

                                    dialog.cancel();
                                }
                            });

                    // Showing Alert Dialog
                    alertDialog2.show();

                }
            });

Детальніше


0

Цей діалоговий фрагмент зробить роботу за вас. Зауважте, що діалогове вікно залишатиметься відкритим після повороту екрана, зберігаючи будь-який текст, який користувач вже ввів. Якщо ви не хочете, щоб це сталося, вам потрібно відхилити фрагмент у вашій активності на вершині. Підпис методу newInstance можна змінити на все, що вам потрібно.

import android.app.Activity;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;

public class TextViewDialogFragment extends DialogFragment implements DialogInterface.OnClickListener, DialogInterface.OnShowListener, TextWatcher
{
    final static private String TITLE = "title", MESSAGE = "message", IDENTIFIER = "identifier", INPUT_TYPE = "inputType", POSITIVE_TEXT = "pText", NEGATIVE_TEXT = "nText", CANCELABLE = "cancelable";

    public TextViewDialogFragment()
    {
        super();
    }

    static public TextViewDialogFragment newInstance(int title, @Nullable String message, int identifier, int inputType, int positiveText, int negativeText, boolean cancelable)
    {
        TextViewDialogFragment fragement = new TextViewDialogFragment();
        Bundle args = new Bundle();
        args.putInt(TITLE, title);
        args.putString(MESSAGE, message);
        args.putInt(IDENTIFIER, identifier);
        args.putInt(INPUT_TYPE, inputType);
        args.putInt(POSITIVE_TEXT, positiveText);
        args.putInt(NEGATIVE_TEXT, negativeText);
        args.putBoolean(CANCELABLE, cancelable);
        fragement.setArguments(args);
        return fragement;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        Activity activity =  getActivity();
        Bundle args = getArguments();
        EditText input = new EditText(activity);
        input.setInputType(args.getInt(INPUT_TYPE));
        input.setId(R.id.dialog_edit_text);
        input.addTextChangedListener(this);
        AlertDialog.Builder alert = new AlertDialog.Builder(activity);
        alert.setCancelable(args.getBoolean(CANCELABLE)).setTitle(args.getInt(TITLE)).setMessage(args.getString(MESSAGE)).setView(input).setPositiveButton(args.getInt(POSITIVE_TEXT), this);
        int negativeText = args.getInt(NEGATIVE_TEXT);
        if (negativeText != 0)
        {
            alert.setNegativeButton(negativeText, this);
        }
        AlertDialog dialog = alert.create();
        dialog.setOnShowListener(this);
        return dialog;
    }

    @Override
    public void onShow(DialogInterface dialog)
    {
        // After device rotation there may be some text present.
        if (((EditText)((AlertDialog) dialog).findViewById(R.id.dialog_edit_text)).length() == 0)
        {
            ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
        }
    }

    @Override
    public void onClick(DialogInterface dialog, int which)
    {
        String text = ((EditText)((AlertDialog) dialog).findViewById(R.id.dialog_edit_text)).getText().toString();
        ((Callbacks) getActivity()).onTextViewDialogResult(which, getArguments().getInt(IDENTIFIER), text);
    }

    @Override
    public void onCancel(DialogInterface dialog)
    {
        ((Callbacks) getActivity()).onTextViewDialogActivityCancelled(getArguments().getInt(IDENTIFIER));
        super.onCancel(dialog);
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after)
    {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count)
    {
    }

    @Override
    public void afterTextChanged(Editable s)
    {
        ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(s.length() > 0);
    }

    void setMessage(String message)
    {
        Bundle args = getArguments();
        args.putString(MESSAGE, message);
        setArguments(args);
    }

    interface Callbacks
    {
        void onTextViewDialogResult(int which, int identity, String text);
        void onTextViewDialogActivityCancelled(int identity);
    }
}

Додайте додатки до своєї діяльності (будь-який тип діяльності є нормальним):

public class Myctivity extends AppCompatActivity implements TextViewDialogFragment.Callbacks
{
...
}

Створіть діалоговий фрагмент у вашій діяльності так:

final static int SOMETHING = 1;
myDF = TextViewDialogFragment.newInstance(R.string.my_title, "my message", SOMETHING, InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, /* Whatever is best for your user. */    R.string.yay, android.R.string.cancel, true);

Обробляйте результат у своїй діяльності таким чином:

@Override
public void onTextViewDialogResult(int which, int identity, String text)
{
    if (which == AlertDialog.BUTTON_NEGATIVE)
    {
        // User did not want to do anything.
        return;
    }
    // text now holds the users answer.
    // Identity can be used if you use the same fragment for more than one type of question.
}
@Override
public void onTextViewDialogActivityCancelled(int identity)
{
    // This is invoked if you set cancelable to true and the user pressed the back button.
}

Вам потрібно створити ідентифікатор ресурсу, щоб додати цей ресурс десь під res / значення

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="dialog_edit_text" type="id"/>
</resources> 

-1
if (editTextEmailAddress.getText().toString().length() == 0) {
    btnCancelCross.setEnabled(false);
} else {
    btnCancelCross.setEnabled(true);
}

Це може допомогти вам дякую.


дякую, але це не те, що я шукаю. Я можу це зробити за допомогою спеціального діалогового вікна та створити макет за допомогою кнопки та увімкнути їх відключення. Що я шукаю, це чи є спосіб відключення або включення вбудованих позитивних та негативних кнопок діалогу? Якщо ви подивитеся на код, яким я поділився, ви побачите, що я шукаю. Але ще раз дякую за код.
акд

2
Будь ласка, опублікуйте одну вичерпну відповідь на тему (просто редагуйте наявну відповідь, не продовжуйте публікувати додаткові відповіді).
Тім Пост
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.