AlertDialog点击button时由于逻辑需要不关闭dialog的实现

案例

对话提示框在平时经常用到,如下图:
这里写图片描述

当用户点击“取消”或“保存并选择图片”时是直接dismiss的,然而我现在需要对输入框中是否输入文字进行判断,来提示用户输入必要的文字,才能跳转到另一个activity进行图片选择

实现方法

需要温习的部分:java反射

//保持dialog不关闭的方法
    private void keepDialogOpen(AlertDialog dialog) {
        try {
            java.lang.reflect.Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
            field.setAccessible(true);
            field.set(dialog, false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //关闭dialog的方法
    private void closeDialog(AlertDialog dialog) {
        try {
            java.lang.reflect.Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
            field.setAccessible(true);
            field.set(dialog, true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

解释:在程序运行过程中反射出dialog的是否在显示的状态字(boolen)mShowing(源码在Dialog类中),通过动态运行过程中改变它的状态来间接使界面无法关闭,下面看具体在调用过程中的实现

程序调用

private void saveFavoriteDialog()
{
    LayoutInflater inflater = LayoutInflater.from(getActivity()); 
    final View view = inflater.inflate(R.layout.favorite_add_dialog, null);  

    dialog = new AlertDialog.Builder(getActivity())  
    .setTitle(R.string.create_favorite)  
    .setIcon(android.R.drawable.ic_menu_save) 
    .setView(view)
    .setPositiveButton(R.string.chose_photo,new DialogInterface.OnClickListener()
    {

        @Override
        public void onClick(DialogInterface dialog, int which)
        {

            favoriteName = (EditText) view.findViewById(R.id.favorite_name_tv);
            String name = favoriteName.getText().toString().trim();
            if(name.length() == 0)
            {
                //条件不符合时点击按钮不消失对话框,提示用户输入必要内容
                keepDialogOpen((AlertDialog) dialog);
                Toast.makeText(getActivity(), R.string.please_enter_favorite_name, Toast.LENGTH_SHORT).show();
            }
            else
            {
                //手动调用dismiss(),先取消对话框,这一步必须调用
                dialog.dismiss();
                Intent intent = new Intent(getActivity(), ChooseFavorite.class);
                intent.putExtra(ChooseFavorite.KEY_FAVORITE_NAME, name);
                startActivityForResult(intent, 0);
            }

        }
    })
    .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener()
    {

        @Override
        public void onClick(DialogInterface dialog, int which)
        {
            closeDialog((AlertDialog) dialog);
        }
    })
    .show();
}

这个方法就是用来打开对话框,然后判断editText中的输入情况,再跳转到下一个activity。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值