栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android 自定义dialog的实现代码

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android 自定义dialog的实现代码

Android 自定义dialog的实现代码

搜索相关关键字网上一大堆实现,但是看完总觉得缺胳膊少腿,绕了不少弯路,终于弄好了自定义dialog。把自己整合的完整代码发上来。

要点:

1、设置自定义dialog的布局文件my_dialog.xml
2、设置一份自定义的样式文件styles_wx.xml,该文件用于覆盖Android的默认主题样式,如黑色边框等。
3、Java代码继承Dialog实现自定义类MyDialog,实现自定义布局,还有设置窗口的大小、位置等。

(网上文章要么少介绍第2点,要么是使用AlterDialog直接实现效果)

先看下效果,模仿微信风格的dialog:

允许添加子view到弹出dialog,如:

代码。

Part1.styles_wx.xml

 
 
 
   
   
    @null  
    true  
    false  
    true  
    @drawable/transparent  
    true  
   
 
 

注意,此处:

@drawable/transparent 

这是设置对话框弹出背景,尝试设置@null,仍然是黑色背景,在使用半透明图片时会受其影响。

所以,可以在这里指定你想要的背景图片或者颜色。

我为了灵活性,我设置该属性为名为"transparent"的图片,这是一张1*1的透明图片。这样背景完全透明,真正使用的背景在my_dialog.xml里定义

Part2.my_dialog.xml

 
 
 
   
 
 
   
 
   
 
   
 
   
 
   
   
 
   
 
     
 
     
   
 
 

Part3.MyDialog.java

package com.kwws; 
 
import android.app.Dialog; 
import android.content.Context; 
import android.os.Bundle; 
import android.util.DisplayMetrics; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
 
import com.navigator.R; 
 
 
public class MyDialog extends Dialog { 
 
   
 
  // 数据 
  String title = "title"; 
  String text = "text"; 
  String cancelButtonText = "cancel"; 
  String okButtonText = "ok"; 
  int okColor = -1; 
  int cancelColor = -1; 
 
  // UI 
  Context mContent; 
  TextView tvTitle; 
  TextView tvSeparator; 
  TextView tvText; 
  TextView tvBtn1; 
  TextView tvBtn2; 
  RelativeLayout childViewWrapper;// 子组件容器 
 
   
  public MyDialog(Context context, String title, String text, 
      String cancelButtonText, String okButtonText) { 
    super(context, R.style.wx_dialog);// 样式定义,该样式去除android默认的黑色背景边框等。 
    this.mContent = context; 
    setDialogStyle(title, text, cancelButtonText, okButtonText); 
  } 
 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    LayoutInflater layout = LayoutInflater.from(mContent); 
    View view = layout.inflate(R.layout.my_dialog, null); 
    setContentView(view); 
    findView(); 
    initView(); 
    initViewEvent(); 
  } 
 
  private void setDialogStyle(String title, String text, 
      String cancelButtonText, String okButtonText) { 
    this.title = title; 
    this.text = text; 
    this.cancelButtonText = cancelButtonText; 
    this.okButtonText = okButtonText; 
  } 
 
  private void findView() { 
    tvTitle = (TextView) findViewById(R.id.tvTitle); 
    tvSeparator = (TextView) findViewById(R.id.tvSeparator); 
    tvText = (TextView) findViewById(R.id.tvText); 
    tvBtn1 = (TextView) findViewById(R.id.tvButton1); 
    tvBtn2 = (TextView) findViewById(R.id.tvButton2); 
    childViewWrapper = (RelativeLayout) findViewById(R.id.rlContent); 
  } 
 
  private void initView() { 
    if (title == null) { 
      tvTitle.setVisibility(View.GONE); 
      tvSeparator.setVisibility(View.GONE); 
    } else { 
      tvTitle.setVisibility(View.VISIBLE); 
      tvSeparator.setVisibility(View.VISIBLE); 
      tvTitle.setText(title); 
    } 
    if (text == null) { 
      tvText.setVisibility(View.GONE); 
    } else { 
      tvText.setVisibility(View.VISIBLE); 
      tvText.setText(text); 
    } 
    if (cancelButtonText == null) { 
      tvBtn1.setVisibility(View.GONE); 
    } else { 
      tvBtn1.setVisibility(View.VISIBLE); 
      tvBtn1.setText(cancelButtonText); 
      if (cancelColor != -1) { 
 tvBtn1.setTextColor(cancelColor); 
      } 
    } 
    if (okButtonText == null) { 
      tvBtn2.setVisibility(View.GONE); 
    } else { 
      tvBtn2.setVisibility(View.VISIBLE); 
      tvBtn2.setText(okButtonText); 
      if (okColor != -1) { 
 tvBtn2.setTextColor(okColor); 
      } 
    } 
 
    if (childViewWrapper != null && childView != null) { 
      childViewWrapper.addView(childView); 
    } 
 
    // 设置对话框大小 
    Window dialogWindow = getWindow(); 
    WindowManager.LayoutParams lp = dialogWindow.getAttributes(); 
    DisplayMetrics d = mContent.getResources().getDisplayMetrics(); 
    // 获取屏幕宽、高用 
    lp.width = (int) (d.widthPixels * 0.8); // 高度设置为屏幕的0.8 
    dialogWindow.setAttributes(lp); 
  } 
 
  private void initViewEvent() { 
    View.onClickListener listener = new View.onClickListener() { 
 
      @Override 
      public void onClick(View v) { 
 // TODO Auto-generated method stub 
 switch (v.getId()) { 
 case R.id.tvButton1: 
   if (mListener != null) { 
     mListener.onCancelButtonClick(MyDialog.this, v); 
   } 
   break; 
 case R.id.tvButton2: 
   if (mListener != null) { 
     mListener.onOKButtonClick(MyDialog.this, v); 
   } 
   break; 
 default: 
   break; 
 } 
      } 
    }; 
    tvBtn1.setonClickListener(listener); 
    tvBtn2.setonClickListener(listener); 
  } 
 
  public interface onDialogButtonClickListener { 
    void onCancelButtonClick(MyDialog dialog, View view); 
 
    void onOKButtonClick(MyDialog dialog, View view); 
  } 
 
  private onDialogButtonClickListener mListener; 
 
   
  public void setonDialogButtonClickListener( 
      onDialogButtonClickListener listener) { 
    this.mListener = listener; 
  } 
 
   
  public void setOKButtonTextColor(int color) { 
    this.okColor = color; 
  } 
 
   
  public void setCancelButtonTextColor(int color) { 
    this.cancelColor = color; 
  } 
 
  View childView; 
 
   
  public void setChildView(View view) { 
    childView = view; 
  } 
} 

Part4.使用

// 退出提示框 
public void exitDialog() { 
 
  MyDialog dialog = new MyDialog(this, "提示", "确认退出?", "取消", "退出"); 
  dialog.setOKButtonTextColor(getResources().getColor(R.color.red)); 
  dialog.setonDialogButtonClickListener(new onDialogButtonClickListener() { 
 
    @Override 
    public void onOKButtonClick(MyDialog dialog, View view) { 
      finish(); 
    } 
 
    @Override 
    public void onCancelButtonClick(MyDialog dialog, View view) { 
      dialog.dismiss(); 
    } 
  }); 
  dialog.show(); 
} 

 
  private void showConfigDialog() { 
    // 读取参数 
    final SharedPreferencesHelper helper = new SharedPreferencesHelper( 
 this, "config"); 
    final String ip = helper.getValue("serverip"); 
    final String port = helper.getValue("serverport"); 
 
    // 配置界面 输入IP和端口的简单界面,这里就不附xml了 
    View view = getLayoutInflater().inflate(R.layout.dialog_config, null); 
    final EditText etIP = (EditText) view.findViewById(R.id.etIP); 
    final EditText etPort = (EditText) view.findViewById(R.id.etPort); 
    etIP.setText(ip != null ? ip : Ksoap2Helper.getServerIP()); 
    etPort.setText(port != null ? port : String.valueOf(Ksoap2Helper 
 .getServerPort())); 
 
    // 配置对话框 
    MyDialog dialog = new MyDialog(this, "参数配置", null, "取消", "确定"); 
    // 添加配置界面到对话框 
    dialog.setChildView(view); 
    // 按钮监听 
    dialog.setonDialogButtonClickListener(new onDialogButtonClickListener() { 
 
      @Override 
      public void onOKButtonClick(MyDialog dialog, View view) { 
 // 保存配置 
 String newIP = etIP.getText().toString(); 
 String newPort = etPort.getText().toString(); 
 
 if (true) { 
   helper.putValue("serverip", newIP); 
   Ksoap2Helper.setServerIP(newIP); 
 } 
 if (true) { 
   helper.putValue("serverport", newPort); 
   Ksoap2Helper.setServerPort(Integer.valueOf(newPort)); 
 } 
 dialog.dismiss(); 
      } 
 
      @Override 
      public void onCancelButtonClick(MyDialog dialog, View view) { 
 dialog.dismiss(); 
      } 
    }); 
    dialog.show(); 
  } 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/159309.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号