android怎样自定义dialog

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android怎样自定义dialog相关的知识,希望对你有一定的参考价值。

android开发过程中,常常会遇到一些需求场景——在界面上弹出一个弹框,对用户进行提醒并让用户进行某些选择性的操作,
如退出登录时的弹窗,让用户选择“退出”还是“取消”等操作。
Android系统提供了Dialog类,以及Dialog的子类,常见如AlertDialog来实现此类功能。
一般情况下,利用Android提供的Dialog及其子类能够满足多数此类需求,然而,其不足之处体现在:
1. 基于Android提供的Dialog及其子类样式单一,风格上与App本身风格可能不太协调;
2. Dialog弹窗在布局和功能上有所限制,有时不一定能满足实际的业务需求。
本文将通过在Dialog基础上构建自定义的Dialog弹窗,以最常见的确认弹框为例。
本样式相对比较简单:上面有一个弹框标题(提示语),下面左右分别是“确认”和“取消”按钮,当用户点击“确认”按钮时,弹框执行
相应的确认逻辑,当点击“取消”按钮时,执行相应的取消逻辑。
首先,自定义弹框样式:

1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="wrap_content"
5 android:background="@drawable/dialog_bg"
6 android:orientation="vertical" >
7
8 <TextView
9 android:id="@+id/title"
10 android:layout_width="wrap_content"
11 android:layout_height="wrap_content"
12 android:layout_gravity="center"
13 android:paddingTop="14dp"
14 android:textColor="@color/login_hint"
15 android:textSize="@dimen/text_size_18" />
16
17 <LinearLayout
18 android:layout_width="match_parent"
19 android:layout_height="wrap_content"
20 android:layout_marginBottom="14dp"
21 android:layout_marginLeft="20dp"
22 android:layout_marginRight="20dp"
23 android:layout_marginTop="30dp" >
24
25 <TextView
26 android:id="@+id/confirm"
27 android:layout_width="wrap_content"
28 android:layout_height="wrap_content"
29 android:layout_marginRight="10dp"
30 android:layout_weight="1"
31 android:background="@drawable/btn_confirm_selector"
32 android:gravity="center"
33 android:textColor="@color/white"
34 android:textSize="@dimen/text_size_16" />
35
36 <TextView
37 android:id="@+id/cancel"
38 android:layout_width="wrap_content"
39 android:layout_height="wrap_content"
40 android:layout_marginLeft="10dp"
41 android:layout_weight="1"
42 android:background="@drawable/btn_cancel_selector"
43 android:gravity="center"
44 android:textColor="@color/login_hint"
45 android:textSize="@dimen/text_size_16" />
46 </LinearLayout>
47
48 </LinearLayout>

然后,通过继承Dialog类构建确认弹框控件ConfirmDialog:

1 package com.corn.widget;
2
3 import android.app.Dialog;
4 import android.content.Context;
5 import android.os.Bundle;
6 import android.util.DisplayMetrics;
7 import android.view.LayoutInflater;
8 import android.view.View;
9 import android.view.Window;
10 import android.view.WindowManager;
11 import android.widget.TextView;
12
13 import com.corn.R;
14
15 public class ConfirmDialog extends Dialog
16
17 private Context context;
18 private String title;
19 private String confirmButtonText;
20 private String cacelButtonText;
21 private ClickListenerInterface clickListenerInterface;
22
23 public interface ClickListenerInterface
24
25 public void doConfirm();
26
27 public void doCancel();
28
29
30 public ConfirmDialog(Context context, String title, String confirmButtonText, String cacelButtonText)
31 super(context, R.style.MyDialog);
32 this.context = context;
33 this.title = title;
34 this.confirmButtonText = confirmButtonText;
35 this.cacelButtonText = cacelButtonText;
36
37
38 @Override
39 protected void onCreate(Bundle savedInstanceState)
40 // TODO Auto-generated method stub
41 super.onCreate(savedInstanceState);
42
43 init();
44
45
46 public void init()
47 LayoutInflater inflater = LayoutInflater.from(context);
48 View view = inflater.inflate(R.layout.confirm_dialog, null);
49 setContentView(view);
50
51 TextView tvTitle = (TextView) view.findViewById(R.id.title);
52 TextView tvConfirm = (TextView) view.findViewById(R.id.confirm);
53 TextView tvCancel = (TextView) view.findViewById(R.id.cancel);
54
55 tvTitle.setText(title);
56 tvConfirm.setText(confirmButtonText);
57 tvCancel.setText(cacelButtonText);
58
59 tvConfirm.setOnClickListener(new clickListener());
60 tvCancel.setOnClickListener(new clickListener());
61
62 Window dialogWindow = getWindow();
63 WindowManager.LayoutParams lp = dialogWindow.getAttributes();
64 DisplayMetrics d = context.getResources().getDisplayMetrics(); // 获取屏幕宽、高用
65 lp.width = (int) (d.widthPixels * 0.8); // 高度设置为屏幕的0.6
66 dialogWindow.setAttributes(lp);
67
68
69 public void setClicklistener(ClickListenerInterface clickListenerInterface)
70 this.clickListenerInterface = clickListenerInterface;
71
72
73 private class clickListener implements View.OnClickListener
74 @Override
75 public void onClick(View v)
76 // TODO Auto-generated method stub
77 int id = v.getId();
78 switch (id)
79 case R.id.confirm:
80 clickListenerInterface.doConfirm();
81 break;
82 case R.id.cancel:
83 clickListenerInterface.doCancel();
84 break;
85
86
87
88 ;
89
90

在如上空间构造代码中,由于控件的"确认"和"取消"逻辑与实际的应用场景有关,因此,控件中通过定义内部接口来实现。

在需要使用此控件的地方,进行如下形式调用:

1 public static void Exit(final Context context)
2 final ConfirmDialog confirmDialog = new ConfirmDialog(context, "确定要退出吗?", "退出", "取消");
3 confirmDialog.show();
4 confirmDialog.setClicklistener(new ConfirmDialog.ClickListenerInterface()
5 @Override
6 public void doConfirm()
7 // TODO Auto-generated method stub
8 confirmDialog.dismiss();
9 //toUserHome(context);
10 AppManager.getAppManager().AppExit(context);
11
12
13 @Override
14 public void doCancel()
15 // TODO Auto-generated method stub
16 confirmDialog.dismiss();
17
18 );
19

调用中实现了此控件的内部接口,并赋给控件本身,以此在点击按钮时实现基于外部具体业务逻辑的函数回调。
参考技术A 1、首先创建布局文件dialog:
复制内容到剪贴板
代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/edit"
android:layout_width="250dip"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/clickbtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="click me" />

</LinearLayout>
2、其次创建MyCustomDialog类继承Dialog:
复制内容到剪贴板
代码:
package com.xzw.custom.dialog;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
/**
* 自定义dialog
* @author Mr.Xu
*
*/
public class MyCustomDialog extends Dialog
//定义回调事件,用于dialog的点击事件
public interface OnCustomDialogListener
public void back(String name);


private String name;
private OnCustomDialogListener customDialogListener;
EditText etName;

public MyCustomDialog(Context context,String name,OnCustomDialogListener customDialogListener)
super(context);
this.name = name;
this.customDialogListener = customDialogListener;


@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog);
//设置标题
setTitle(name);
etName = (EditText)findViewById(R.id.edit);
Button clickBtn = (Button) findViewById(R.id.clickbtn);
clickBtn.setOnClickListener(clickListener);


private View.OnClickListener clickListener = new View.OnClickListener()

@Override
public void onClick(View v)
customDialogListener.back(String.valueOf(etName.getText()));
MyCustomDialog.this.dismiss();

;


3、最后再完成MainActivity:
复制内容到剪贴板
代码:
package com.xzw.custom.dialog;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener
private TextView resultText;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
resultText = (TextView) findViewById(R.id.result);
Button showDialogBtn = (Button) findViewById(R.id.showdialog);
showDialogBtn.setOnClickListener(this);



@Override
public void onClick(View v)
MyCustomDialog dialog = new MyCustomDialog(this,"Enter your name",new MyCustomDialog.OnCustomDialogListener()

@Override
public void back(String name)
resultText.setText("Enter name is "+name);


);
dialog.show();



参考技术B   在android学习中大家对于android很多东西,都有了新的了解或者说真正的掌握,关于dialog实例大家一定会经常用到,但如何才能更好的设计使它符合自己的需求,本篇将会为大家讲述。
  第一个需求:简单的自定义dialog
  需求:创建一个dialog,该dialog具备以下功能:
  1.有一个窗口可以显示文章
  2.根据需求显示
  1)点击同意(不同意),触发对应的事件(同意的事件会弹出一个Toast,不同意则会关闭程序)
  2)点击关闭,关闭dialog
  1.在main.xml文件中设定一个按钮,点击会弹出dialog
  View Code
  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >
  <Button
  android:layout_width="100dp"
  android:layout_height="50dp"
  android:layout_centerHorizontal="true"
  android:layout_centerVertical="true"
  android:text="@string/hello_world"
  android:id="@+id/btn"
  android:background="@drawable/sl_btn_red" />
  </RelativeLayout>2.创建dialog的内容布局,布局中设定了使用相对布局设定了三个按钮,其中两个一起出现(同意和不同意),另外一个单独出现(关闭)默认是两个出现
  View Code
  private TextView btnClose = null;
  private TextView btnAgree = null;
  private TextView btnDisagree = null;
  private WebView mWebView = null;
  public MyDialog(Context context)
  super(context, R.style.item_tnc_dialog);
  setCancelable(false); // 阻止返回键的响应
  setContentView(R.layout.dialog_view);
  getWindow().setLayout(LayoutParams.MATCH_PARENT,
  LayoutParams.MATCH_PARENT);
  setUpView();
  
  private void setUpView()
  mWebView = (WebView) findViewById(R.id.item_tnc_dialog_webview);
  btnClose = (TextView) findViewById(R.id.item_tnc_dialog_close);
  btnAgree = (TextView) findViewById(R.id.item_tnc_dialog_agree);
  btnDisagree = (TextView) findViewById(R.id.item_tnc_dialog_disagree);
  btnClose.setOnClickListener(new View.OnClickListener()
  public void onClick(View v)
  dismiss();
  
  );
  btnDisagree.setOnClickListener(new View.OnClickListener()
  @Override
  public void onClick(View v)
  dismiss();
  System.exit(0);
  
  );
  btnAgree.setOnClickListener(new View.OnClickListener()

  @Override
  public void onClick(View v)
  Toast.makeText(getContext(), "YOU SELECTED AGREE",
  Toast.LENGTH_SHORT).show();
  dismiss();
  

  
  );
  showDialog();
  
  /** 加载webview的内容 */
  public void showDialog()

  String localhtml = "file:///android_asset/los.html";

  if (mWebView != null)
  mWebView.getSettings().setDefaultTextEncodingName("utf-8");
  mWebView.loadUrl(localHtml);
  
  buttonsDisplayTwo(false);
  
  /** 当true的时候,出现同意和不同意两个选项,反之是关闭选项 */
  private void buttonsDisplayTwo(boolean two)
  btnAgree.setVisibility(two ? View.VISIBLE : View.GONE);
  btnDisagree.setVisibility(two ? View.VISIBLE : View.GONE);
  btnClose.setVisibility(two ? View.GONE : View.VISIBLE);
  3.main.activity的代码就不写了。。直接写自定义的dialog代码

  View Code
  private TextView btnClose = null;
  private TextView btnAgree = null;
  private TextView btnDisagree = null;

  private WebView mWebView = null;

  public MyDialog(Context context)
  super(context, R.style.item_tnc_dialog);

  setCancelable(false); // 阻止返回键的响应
  setContentView(R.layout.dialog_view);
  getWindow().setLayout(LayoutParams.MATCH_PARENT,
  LayoutParams.MATCH_PARENT);
  setUpView();

  
  private void setUpView()
  mWebView = (WebView) findViewById(R.id.item_tnc_dialog_webview);
  btnClose = (TextView) findViewById(R.id.item_tnc_dialog_close);

  btnAgree = (TextView) findViewById(R.id.item_tnc_dialog_agree);
  btnDisagree = (TextView) findViewById(R.id.item_tnc_dialog_disagree);

  btnClose.setOnClickListener(new View.OnClickListener()

  public void onClick(View v)
  dismiss();
  
  );

  btnDisagree.setOnClickListener(new View.OnClickListener()

  @Override
  public void onClick(View v)
  dismiss();
  System.exit(0);
  
  );
  btnAgree.setOnClickListener(new View.OnClickListener()

  @Override
  public void onClick(View v)
  Toast.makeText(getContext(), "YOU SELECTED AGREE",
  Toast.LENGTH_SHORT).show();
  dismiss();
  
  );
  showDialog();
  

  /** 加载webview的内容 */
  public void showDialog()

  String localHtml = "file:///android_asset/los.html";

  if (mWebView != null)
  mWebView.getSettings().setDefaultTextEncodingName("utf-8");
  mWebView.loadUrl(localHtml);
  
  buttonsDisplayTwo(false);
  
  /** 当true的时候,出现同意和不同意两个选项,反之是关闭选项 */
  private void buttonsDisplayTwo(boolean two)
  btnAgree.setVisibility(two ? View.VISIBLE : View.GONE);
  btnDisagree.setVisibility(two ? View.VISIBLE : View.GONE);
  btnClose.setVisibility(two ? View.GONE : View.VISIBLE);
  

以上是关于android怎样自定义dialog的主要内容,如果未能解决你的问题,请参考以下文章

自定义Dialog对话框

自定义Dialog对话框

android Dialog怎样自定义属性?

android怎样自定义dialog

android怎样自定义dialog

如何自定义Android Dialog的样式?