您的位置:首页 > 移动开发 > Android开发

Android 4.0设置Dialog点击屏幕不消失

2014-06-19 08:22 459 查看
业务的需求是变化莫测的,最近就遇到一个需求是——用户只有点击Dialog的取消按钮才会消失,点击屏幕的时候不消失。Android ICS对UI做了很大的变动,系统提倡使用DialogFragment,但是系统默认的操作习惯是点击屏幕Dialog会自动消失。

为了实现业务的需求,想过使用Dialog风格的Activity,但是做出来的效果和系统的UI效果不匹配,最终只有失败告终。在黔驴技穷的时候,决定再仔细撸一下Android文档,终于在文档中发现了Dialog的setCanceledOnTouchOutside属性,具体使用如下:

方法一:

[java] view
plaincopy

public class MyAlertDialogFragment extends DialogFragment {  

  

    public static MyAlertDialogFragment newInstance(int title) {  

        MyAlertDialogFragment frag = new MyAlertDialogFragment();  

        Bundle args = new Bundle();  

        args.putInt("title", title);  

        frag.setArguments(args);  

        return frag;  

    }  

  

    @TargetApi(11)  

    @Override  

    public Dialog onCreateDialog(Bundle savedInstanceState) {  

        int title = getArguments().getInt("title");  

  

          

        AlertDialog dialog = new AlertDialog.Builder(getActivity())  

        .setIcon(R.drawable.ic_launcher)  

          

        .setTitle(title)  

        .setPositiveButton(R.string.alert_dialog_ok,  

            new DialogInterface.OnClickListener() {  

                public void onClick(DialogInterface dialog, int whichButton) {  

                    ((MainActivity)getActivity()).doPositiveClick();  

                }  

            }  

        )  

        .setNegativeButton(R.string.alert_dialog_cancel,  

            new DialogInterface.OnClickListener() {  

                public void onClick(DialogInterface dialog, int whichButton) {  

                    ((MainActivity)getActivity()).doNegativeClick();  

                }  

            }  

        )  

        .create();  

        dialog.setCanceledOnTouchOutside(false);// 设置点击屏幕Dialog不消失  

          

        return dialog;  

    }  

}  

方法二:

在oncreate()方法中设置Dialog点击屏幕不可取消,实例代码如下:

[java] view
plaincopy

@Override      

 public void onCreate(Bundle icicle)  

 {  

    super.onCreate(icicle);  

    this.setCancelable(false);// 设置点击屏幕Dialog不消失  

     int style = DialogFragment.STYLE_NORMAL, theme = 0;  

     setStyle(style,theme);  

 }  

(提示:提醒大家一下在覆写了onCreateDialog()方法后,就不能覆写onCreateView()方法了)

说到这儿就给大家介绍一下创建DialogFragment的第二种方式吧,第一种方式上面已经叙述了,在此就不再叙述了,直接看第二种实现的具体方式,具体代码如下所示:

[java] view
plaincopy

import android.app.Activity;  

import android.app.DialogFragment;  

import android.app.FragmentTransaction;  

import android.content.DialogInterface;  

import android.os.Bundle;  

import android.util.Log;  

import android.view.LayoutInflater;  

import android.view.View;  

import android.view.ViewGroup;  

import android.widget.Button;  

import android.widget.EditText;  

import android.widget.TextView;  

  

public class PromptDialogFragment   

extends DialogFragment   

implements View.OnClickListener  

{  

    private EditText et;  

  

    public static PromptDialogFragment  

    newInstance(String prompt)  

    {  

        PromptDialogFragment pdf = new PromptDialogFragment();  

        Bundle bundle = new Bundle();  

        bundle.putString("prompt",prompt);  

        pdf.setArguments(bundle);  

          

        return pdf;  

    }  

  

    @Override  

    public void onAttach(Activity act) {  

        // If the activity we're being attached to has  

        // not implemented the OnDialogDoneListener  

        // interface, the following line will throw a  

        // ClassCastException. This is the earliest we  

        // can test if we have a well-behaved activity.  

        OnDialogDoneListener test = (OnDialogDoneListener)act;  

        super.onAttach(act);  

    }  

  

    @Override      

    public void onCreate(Bundle icicle)  

    {  

        super.onCreate(icicle);  

        this.setCancelable(true);  

        int style = DialogFragment.STYLE_NORMAL, theme = 0;  

        setStyle(style,theme);  

    }  

    //  覆写onCreateView()方法,实现DialogFragment的布局。注意不能同时覆写 onCreateView()和onCreateDialog()方法  

    public View onCreateView(LayoutInflater inflater,              

            ViewGroup container,   

            Bundle icicle)  

    {  

        View v = inflater.inflate(  

                R.layout.prompt_dialog, container, false);  

  

        TextView tv = (TextView)v.findViewById(  

                                   R.id.promptmessage);  

        tv.setText(getArguments().getString("prompt"));  

  

        Button dismissBtn = (Button)v.findViewById(  

                                       R.id.btn_dismiss);  

        dismissBtn.setOnClickListener(this);  

  

        Button saveBtn = (Button)v.findViewById(  

                                    R.id.btn_save);  

        saveBtn.setOnClickListener(this);  

  

        Button helpBtn = (Button)v.findViewById(  

                R.id.btn_help);  

        helpBtn.setOnClickListener(this);  

  

        et = (EditText)v.findViewById(R.id.inputtext);  

        if(icicle != null)  

            et.setText(icicle.getCharSequence("input"));  

        return v;  

    }  

  

    @Override  

    public void onSaveInstanceState(Bundle icicle) {  

        icicle.putCharSequence("input", et.getText());  

        super.onPause();  

    }  

  

    @Override  

    public void onCancel(DialogInterface di) {  

        Log.v(MainActivity.LOGTAG, "in onCancel() of PDF");  

        super.onCancel(di);  

    }  

  

    @Override  

    public void onDismiss(DialogInterface di) {  

        Log.v(MainActivity.LOGTAG, "in onDismiss() of PDF");  

        super.onDismiss(di);  

    }  

  

    public void onClick(View v)   

    {  

        OnDialogDoneListener act = (OnDialogDoneListener)getActivity();  

        if (v.getId() == R.id.btn_save)  

        {  

            TextView tv = (TextView)getView().findViewById(R.id.inputtext);  

            act.onDialogDone(this.getTag(), false, tv.getText());  

            dismiss();  

            return;  

        }  

        if (v.getId() == R.id.btn_dismiss)  

        {  

            act.onDialogDone(this.getTag(), true, null);  

            dismiss();  

            return;  

        }  

        if (v.getId() == R.id.btn_help)  

        {  

            FragmentTransaction ft = getFragmentManager().beginTransaction();  

            ft.remove(this);  

  

            // in this case, we want to show the help text, but  

            // come back to the previous dialog when we're done  

            ft.addToBackStack(null);  

            //null represents no name for the back stack transaction  

  

            HelpDialogFragment hdf =  

                    HelpDialogFragment.newInstance(R.string.help1);  

            hdf.show(ft, MainActivity.HELP_DIALOG_TAG);  

            return;  

        }  

    }  

}  

代码比较简单,注释已经写明白了,相信大家都能看懂的! 

以上只是设置Dialog的一个小技巧以及创建DialogFragment的两种创建方式,希望对大家有所帮助。

原创:http://blog.csdn.net/weihan1314/article/details/8026830
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息