วิธีปิด / เปิดใช้งานปุ่มบวกลบของกล่องโต้ตอบ


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/…
Alexander Kulyakhtin

ขอบคุณ แต่นี่ไม่ใช่คำตอบ มันอาจช่วยได้ เพราะมันปิดใช้งานปุ่มหลังจากคลิกตัวมันเอง ซึ่งไม่ใช่สิ่งที่ฉันต้องการ ฉันต้องการแสดงว่าปิดใช้งานขึ้นอยู่กับฟิลด์ข้อความ
akd

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

โดยทั่วไปคุณกำลังสร้างวัตถุที่มีการอ้างอิงแบบไม่ระบุชื่อเมื่อสร้างขึ้นแล้วคุณจะไม่สามารถอ้างอิงได้อีก ขอบคุณ
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

สำหรับปุ่ม id : Reference alert_dialog.xml

แก้ไข:

และsetOnShowListenerตั้งแต่ระดับ 8 API (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

สำหรับ skimmers ฉันต้องการเพิ่ม dialog.getButton () นั้นใช้ได้กับ AlertDialogs เท่านั้นดังนั้นคุณอาจต้องส่งกล่องโต้ตอบไปที่ AlertDialog เมื่อคุณทำโพสต์ต่อไป
Noumenon

ไม่ทำงาน - ฉันอ่านโค้ดอย่างน้อย 5x และก็ยังไม่สมเหตุสมผลว่าทำไมถึงใช้งานได้ :) คำตอบที่ถูกต้องอยู่ด้านล่างจาก Nick Palmer
qkx

@qkx คุณช่วยอธิบายสิ่งที่คุณพยายามทำ คุณสามารถแสดงรหัสที่เกี่ยวข้องได้หรือไม่? และอย่าแดกดันและโหวตลด
Pankaj Kumar

1
ฉันไม่ได้ต้องการที่จะแดกดันหยาบคาย นอกจากนี้ฉันพยายามยกเลิกการลงคะแนน แต่ก็ไม่สามารถทำได้ ... อย่างไรก็ตามอีกครั้งสำหรับปัญหา - คุณมีตัวฟังข้อความอยู่ที่ไหนในรหัสของคุณคุณช่วยบอกฉันได้ไหม ไม่สำคัญว่าสภาพจะเป็นอย่างไรหากถูกเรียกเพียงครั้งเดียว หากคุณไม่มีตัวฟังข้อความอย่าง Nick ด้านล่างนี้เป็นไปไม่ได้เลยที่โซลูชันของคุณจะใช้งานได้ ... หรือฉันพลาดบางอย่าง หรือส่งโปรเจ็กต์ Android ง่ายๆมาให้ฉันเพื่อพิสูจน์ว่ามันใช้งานได้;)
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.
Nick Palmer

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

คุณสามารถเขียนสิ่งที่ฟังลงในกล่องข้อความแก้ไขและลองเปิดหรือปิดใช้งานปุ่มต่างๆ นี่คือโค้ดตัวอย่างสำหรับ xamarin

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

dialogFragment นี้จะทำงานให้คุณ โปรดทราบว่ากล่องโต้ตอบจะยังคงเปิดอยู่หลังจากการหมุนหน้าจอเพื่อรักษาข้อความใด ๆ ที่ผู้ใช้พิมพ์ไว้แล้วหากคุณไม่ต้องการให้สิ่งนั้นเกิดขึ้นคุณต้องปิดส่วนใน onStop ของกิจกรรมของคุณ ลายเซ็นวิธีการ 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
{
...
}

สร้าง diaglogFragment ในกิจกรรมของคุณดังนี้:

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 / values

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

นั่นอาจช่วยคุณได้ขอบคุณ


ขอบคุณ แต่นี่ไม่ใช่สิ่งที่ฉันกำลังมองหา ฉันสามารถทำได้โดยใช้กล่องโต้ตอบที่กำหนดเองและสร้างเค้าโครงด้วยปุ่มและเปิดใช้งานปิดใช้งาน สิ่งที่ฉันกำลังมองหาคือมีวิธีปิดหรือเปิดใช้งานปุ่มโต้ตอบบวกและลบในตัวหรือไม่? หากคุณดูรหัสที่ฉันแชร์คุณจะเห็นสิ่งที่ฉันกำลังมองหา แต่ขอขอบคุณอีกครั้งสำหรับรหัส
akd

2
กรุณาโพสต์หนึ่งที่ครอบคลุมเกี่ยวกับคำตอบหัวข้อ (เพียงแก้ไขคำตอบมีอยู่ของคุณไม่ให้โพสต์คำตอบเพิ่มเติม)
Tim Post
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.