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

Android自定义Dialog的一些问题

2016-02-28 00:37 696 查看

Android自定义Dialog的一些问题

怎样自定义Dialog

Android自带的Dialog不管是样式还是功能都比较普通。如果有比较特殊的需求,比如自定义的布局、不需要标题栏、不需要按钮以及多个dialog页面切换,就需要自定义Dialog。

自定义Dialog一般是对Dialog的重写,比如继承一个AlertDialog类。然后重写onCreate方法,把自定义的布局加进去即可,同时设置布局元素的事件响应。

dialog在onCreate方法中设置不显示标题栏:

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

一般自定义dialog的事件响应都会给Activity一个回调:

[code]package com.demo;   

 import android.app.Dialog;   
 import android.content.Context;   
 import android.os.Bundle;   
 import android.view.View;   
 import android.view.View.OnClickListener;   
 import android.widget.Button;   

 public class LeaveMeetingDialog extends Dialog  implements OnClickListener{   

 private Button  quitBtn,stopBtn,cancelBtn;   
 private LeaveMeetingDialogListener listener;   

 public interface LeaveMeetingDialogListener{   
     public void onClick(View view);   
 }   

 public LeaveMeetingDialog(Context context,int theme,LeaveMeetingDialogListener listener) {   
     super(context,theme);   
 }   

 @Override   
 protected void onCreate(Bundle savedInstanceState) {   
     super.onCreate(savedInstanceState);   
     setContentView(R.layout.leave_meeting_dialog);   
     initViews();   
 }   

 private void initViews(){   
     quitBtn = (Button)findViewById(R.id.quit_btn);   
     stopBtn = (Button)findViewById(R.id.stop_btn);   
     cancelBtn = (Button)findViewById(R.id.cancel_btn);   

     quitBtn.setOnClickListener(this);   
     stopBtn.setOnClickListener(this);   
     cancelBtn.setOnClickListener(this);   
 }   

 @Override   
 public void onClick(View v) {   
     listener.onClick(v);   
 }   

 } 
---调用处:  

[java]  
 LeaveMeetingDialog  dialog = new LeaveMeetingDialog(this,R.style.Theme_CustomDialog,   
             new LeaveMeetingDialogListener() {   
         @Override   
         public void onClick(View view) {   
             switch(view.getId()){   
                 case R.id.quit_btn:break;   
                 case R.id.stop_btn:break;   
                 case R.id.cancel_btn:break;   
             }   
         }   
 });   
       dialog.show();


代码来源:http://www.cnblogs.com/rainly/p/3435110.html

自定义Dialog一些特殊设置

平常设置AlertDialog一些功能,比如点击外部区域Dialog不消失、点击返回键也不消失等,都是通过AlertDialog的Builder来完成。自定义Dialog如果继承自AlertDialog,按理说也可以以这样的方式:

[code]builder.setTitle(getText(R.string.XXXX))
                        .setMessage(getText(R.XXXXXX))
                        .setOnKeyListener(key)//返回键监听器
                        .setCancelable(false)//设置点击外部区域dialog不消失
                        .setPositiveButton(android.R.string.ok, someOKButtonListener)
                        .setNegativeButton(android.R.string.cancel, null);
 OnKeyListener keylistener = new DialogInterface.OnKeyListener(){
        public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
            if (keyCode==KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0)
            {
             return true;//返回true会截断返回键的点击事件,不做其他处理
            }
            else
            {
             return false;
            }
        }
    } ;


代码来源:http://www.apkbus.com/android-114253-1-1.html

但是实际上没有作用。而是应该设置:

[code]dialog.setCancelable(false);
dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
                    @Override
                    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                        if (keyCode==KeyEvent.KEYCODE_BACK && event.getRepeatCount()==0)
                        {
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                });


背景虚化

Android在API 14以后不再支持Dialog背景虚化。参见

下面的代码没有作用。

[code]setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
WindowManager.LayoutParams.FLAG_BLUR_BEHIND);




[code]WindowManager.LayoutParams lp = dialog.getWindow().getAttributes(); 
lp.dimAmount = 0.55f; //0f背景亮度不变,1f背景变黑
dialog.getWindow().setAttributes(lp); 
dialog.getWindow() 
.addFlags(WindowManager.LayoutParams.FLAGDIMBEHIND);


只是实现背景亮度改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: