簡體   English   中英

如何從 AlertDialog 顯示 Toast?

[英]How to display Toast from AlertDialog?

當用戶單擊保存按鈕時, AlertDialog出現一個AlertDialog並要求用戶輸入文件名的文本。

如果用戶在沒有指定名稱的情況下單擊肯定按鈕(“確定”),我想顯示一個要求他們這樣做的吐司,並保持AlertDialog打開狀態。 但是吐司永遠不會顯示並且對話框關閉。

AlertDialog的代碼在這里:

    AlertDialog.Builder alert = new AlertDialog.Builder(this);

    alert.setTitle(R.string.save_game);
    alert.setMessage(R.string.request_name);

    // Set an EditText view to get user input 
    final EditText input = new EditText(this);
    input.setHint(R.string.untitled);
    alert.setView(input);

    alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
      String value = input.getText().toString();
      if(value != null){
          // Do something with value      
      }
      else{
          Toast.makeText(context, R.string.no_name_given, Toast.LENGTH_SHORT).show();
      }
    }
    });

    alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        // Canceled.
    }
    });

    alert.show();

我怎樣才能做到這一點?

謝謝!

Public void showToast() {
    Toast.makeText(this, R.string.no_name_given, Toast.LENGTH_SHORT).show();
} 

只需調用此方法,而不是在您的代碼中顯示這樣的警告對話框中的 toast。

else {
    showToast();
}

要保持打開狀態,請使用此方法

public void forceOpen() {

    AlertDialog.Builder alert = new AlertDialog.Builder(this);

    alert.setTitle(R.string.save_game);
    alert.setMessage(R.string.request_name);

    // Set an EditText view to get user input 
    final EditText input = new EditText(this);
    input.setHint(R.string.untitled);
    alert.setView(input);

    alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            String value = input.getText().toString();
            if(value != null) {
                // Do something with value      
            }
            else {
                Toast.makeText(context, R.string.no_name_given, Toast.LENGTH_SHORT).show();
            }
        }
    });

    alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            // Canceled.
        }
    });

    alert.show();

}

只需重新打開它.. 不知道為什么它會關閉,但這會起作用

更改代碼如下:

if(value != null && value.length()>0){

// Do something with value      
 }else{
          Toast.makeText(context, R.string.no_name_given, Toast.LENGTH_SHORT).show();
}

您可以禁用確定按鈕。如果條件成立,則再次啟用按鈕。

public void alert()
    {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.simple, null);

        final EditText etText = (EditText) v.findViewById(R.id.etName);

        final AlertDialog d = new AlertDialog.Builder(this)
        .setView(v)
        .setTitle("Warning ..")
        .setPositiveButton(android.R.string.ok,
                new Dialog.OnClickListener() {
            @Override
            public void onClick(DialogInterface d, int which) 
            {
                //Do nothing here. We override the onclick
                Toast.makeText(getApplicationContext(), "Enter Text", Toast.LENGTH_LONG).show(); 
            }
        })
        .setNegativeButton(android.R.string.cancel, null)
        .create();
        d.show();
}

使用 DialogInterface 從 AlertDialog 的 OnClick 方法獲取上下文的一種簡單方法:

((Dialog) dialogInterface).getContext()

在 OnClick() 方法中使用它:

public void onClick(DialogInterface dialogInterface, int which) {
        Toast.makeText(((Dialog) dialogInterface).getContext(), "Bla-bla" , Toast.LENGTH_SHORT).show();
}

通用解決方案

如果您想從 Dialog 更新 Activity 上的任何內容,此解決方案可能會有所幫助。 例如,顯示來自 Dialog 按鈕單擊的 Toast 消息。

創建監聽器

public interface YesNoClickListner {

    public void yesClicked();

    public void noClicked();
}

在對話框中傳遞接口

public class FireMissilesDialog extends DialogFragment {

    private YesNoClickListner listner;

    public FireMissilesDialog(YesNoClickListner listner){
        this.listner = listner;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage("This is custom Dialog")
            .setPositiveButton("YES", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    listner.yesClicked();
                }
            })
            .setNegativeButton("NO", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    listner.noClicked();
                }
            });
        return builder.create();
    }
}

在您的 Activity 中實現偵聽器並覆蓋方法

public class MainActivity extends AppCompatActivity implements YesNoClickListner{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FireMissilesDialog fireMissilesDialog = new FireMissilesDialog(this);
        fireMissilesDialog.show(getSupportFragmentManager(),"Dialog");

    }

    @Override
    public void yesClicked() {
        Toast.makeText(this, "Yes Clicked", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void noClicked() {
        Toast.makeText(this, "No Clicked", Toast.LENGTH_SHORT).show();
    }
}

結果:

在此處輸入圖片說明

此解決方案可能不是您解決此特定問題所需的完全解決方案。 但這一般有效。 例如,如果您需要在 YES 按鈕上更新您的 Activity 中的 textView,那么只需覆蓋這樣的方法即可。

@Override
public void yesClicked() {
   Toast.makeText(this, "Yes Clicked", Toast.LENGTH_SHORT).show();
}

相關鏈接:

完整的工作代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM