如何从AlertDialog中显示Toast?

6
当用户点击保存按钮时,会出现一个AlertDialog,要求用户输入文件名。
如果用户在没有指定名称的情况下单击了确认按钮(“确定”),我想显示一个toast来要求他们这样做,并保持AlertDialog打开。但是toast从未显示过,对话框也关闭了。
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();

我该如何实现这个呢?
谢谢!

什么是上下文?它是活动上下文吗? - Raghunandan
1
жҳҜзҡ„гҖӮзҲ¶жҙ»еҠЁеңЁе…¶onCreateпјҲ...пјүдёӯи®ҫзҪ®context = thisгҖӮ - Rookatu
6个回答

6
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();

}

只需重新打开它即可。不确定为什么会关闭,但这样做可以解决问题。


这会显示Toast,但不会保持AlertDialog打开。 - Rookatu
嗯,不确定为什么,你从未调用过关闭。当用户点击“确定”时,只需重新打开它即可... 他们不会注意到的。 - NightSkyCode
我看到你把代码放进了一个方法里。你是在建议这个方法从“确定”按钮的代码中调用自己,形成一种递归?问题是,我认为第一个AlertDialog直到点击被消耗之前都不会被销毁,所以这很可能会在AlertDialog之上叠加AlertDialog。 - Rookatu
是的,将其设置为一个方法,并让它调用自身。而且,我刚刚尝试了一下,看起来很自然。除非从头开始创建一个没有自己布局的自定义对话框,否则没有其他办法可以做到这一点。 - NightSkyCode
好的,我尝试过了,它起作用了。看起来有些取巧,但如果唯一的选择是制作一个自定义对话框,那么我现在会选择这个。谢谢! - Rookatu
是的,这很hacky,但如果hacky能够正常工作,那就没有问题。没问题! - NightSkyCode

2

请将代码更改如下:

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

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

这会显示Toast,但不会保持AlertDialog打开。 - Rookatu
@Rookatu,你尝试过上面的解决方案了吗?希望它能起作用,因为你之前的条件语句没有检查文本值的长度。 - Suji
是的,我尝试了你的建议。它解决了Toast不显示的问题,但正如我上面的评论所述,它没有保持AlertDialog打开。我想让它一直保持打开状态,直到用户输入有效的文件名并按下“确定”,或者按下“取消”。 - Rookatu
当您单击任何提供的按钮时,AlertDialog默认将关闭,对吗?如果您仍然想要它,请使用自定义对话框(具有自定义布局xml的对话框),如此处所示:https://dev59.com/MW865IYBdhLWcg3wCqHI - Suji

1
您可以禁用“确定”按钮。如果条件通过验证,则再次启用该按钮。

如果我这样做,当单击按钮时如何显示 Toast?或者您建议我放弃那个想法? - Rookatu
是的,你可以改变你的想法。 - G-zone
或者您可以使用自定义对话框而不是AlertDialog。 - G-zone

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

0

一个简单的方法,适用于我从AlertDialog的OnClick方法中获取Context,使用DialogInterface:

((Dialog) dialogInterface).getContext()

在OnClick()方法中使用它:

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

0

通用解决方案

如果您想从对话框更新 Activity 上的任何内容,这个解决方案可能会有所帮助。例如,从对话框按钮单击显示 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();
    }
}

结果:

enter image description here

这个解决方案可能不是你解决这个问题所需要的。但是它通常是有效的。例如,如果你需要在点击“是”按钮时更新Activity中的textView,则可以像这样覆盖此方法。
@Override
public void yesClicked() {
   Toast.makeText(this, "Yes Clicked", Toast.LENGTH_SHORT).show();
}

相关链接:

完整可运行代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接