服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android Dialog仿ios9中UIAlertController控件

Android Dialog仿ios9中UIAlertController控件

2022-03-06 20:28lady_zhou Android

这篇文章主要为大家详细介绍了Android Dialog仿ios9中UIAlertController控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

最近因为项目需要,用Android Dialog仿ios9中的UIAlertController控件,第一次对自定义控件进行封装,请大家多多指教

Android Dialog仿ios9中UIAlertController控件

如图所示,当我封装的Dialog被触发时,从底部弹出,点击取消键整个弹框会消失,当点击不同的TextView会有相应的点击事件发生,目前只写了三个能被点击的TextView(以后会改为可以动态添加个数)。
以下代码是我封装的BottomDialog:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
public class BottomDialog extends Dialog {
 private TextView mTitleTv;
 private TextView mOneTv;
 private TextView mTwoTv;
 private TextView mCancelTv;
 private Dialog myDialog;
 private ClickListenerInterface clickListenerInterface;
 
 public interface ClickListenerInterface {
  void onTitleClick();//点击标题TextView
 
  void onOneClick();//点击第一个TextView
 
  void onTwoClick();//点击第二个TextView
 }
 
 public BottomDialog(@NonNull Context context) {
  super(context);
  init();
 }
 
 public BottomDialog(@NonNull Context context, @StyleRes int themeResId) {
  super(context, themeResId);
  init();
 }
 
 protected BottomDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
  super(context, cancelable, cancelListener);
  init();
 }
 
 private void init() {
  myDialog = new Dialog(getContext(), R.style.BottomDialogStyle);
  //填充对话框的布局
  View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_bottom, null);
  //初始化控件
  mTitleTv = (TextView) view.findViewById(R.id.tv_dialog_title);
  mOneTv = (TextView) view.findViewById(R.id.tv_dialog_one);
  mTwoTv = (TextView) view.findViewById(R.id.tv_dialog_two);
  mCancelTv = (TextView) view.findViewById(R.id.tv_dialog_cancel);
 
  mTitleTv.setOnClickListener(new DialogClickListener());
  mOneTv.setOnClickListener(new DialogClickListener());
  mTwoTv.setOnClickListener(new DialogClickListener());
  mCancelTv.setOnClickListener(new DialogClickListener());
 
  //将布局设置给Dialog
  myDialog.setContentView(view);
  //获取当前Activity所在的窗体
  Window dialogWindow = myDialog.getWindow();
  //设置Dialog从窗体底部弹出
  dialogWindow.setGravity(Gravity.BOTTOM);
 
  //获得窗体的属性
  WindowManager.LayoutParams lp = dialogWindow.getAttributes();
  lp.width = (int) (dialogWindow.getWindowManager().getDefaultDisplay().getWidth() * 0.95);
  lp.y = 20; //设置Dialog距离底部的距离
  dialogWindow.setAttributes(lp); //将属性设置给窗体
  myDialog.show();//显示对话框
 }
 
 public void setClicklistener(ClickListenerInterface clickListenerInterface) {
  this.clickListenerInterface = clickListenerInterface;
 }
 
 private class DialogClickListener implements View.OnClickListener {
  @Override
  public void onClick(View v) {
   switch (v.getId()) {
    case R.id.tv_dialog_title:
     clickListenerInterface.onTitleClick();
     break;
    case R.id.tv_dialog_one:
     clickListenerInterface.onOneClick();
     break;
    case R.id.tv_dialog_two:
     clickListenerInterface.onTwoClick();
     break;
    case R.id.tv_dialog_cancel:
     myDialog.dismiss();
     break;
   }
  }
 }
 
 public void dismissDialog() {
  if (myDialog != null && myDialog.isShowing()) {
   myDialog.dismiss();
  }
 }
 
 /**
  * 设置标题栏文本文字
  *
  * @param stringId
  * @see #setTitleText(String)
  */
 public void setTitleText(@StringRes int stringId) {
  setTitleText(getContext().getString(stringId));
 }
 
 /**
  * 设置标题栏文本文字
  *
  * @param text
  */
 public void setTitleText(String text) {
  mTitleTv.setText(text);
  mTitleTv.setVisibility(View.VISIBLE);
 }
 
 /**
  * 设置第一个TextView文字
  *
  * @param stringId
  */
 public void setOneText(@StringRes int stringId) {
  setOneText(getContext().getString(stringId));
 }
 
 /**
  * 设置第一个TextView文字
  *
  * @param text
  */
 public void setOneText(String text) {
  mOneTv.setText(text);
  mOneTv.setVisibility(View.VISIBLE);
 }
 
 /**
  * 设置第二个TextView文字
  *
  * @param stringId
  */
 public void setTwoText(@StringRes int stringId) {
  setTwoText(getContext().getString(stringId));
 }
 
 /**
  * 设置第二个TextView文字
  *
  * @param text
  */
 public void setTwoText(String text) {
  mTwoTv.setText(text);
  mTwoTv.setVisibility(View.VISIBLE);
 }
 
 /**
  * 获取标题栏文本
  *
  * @return
  */
 public final TextView getTitleTv() {
  return mTitleTv;
 }
 
 /**
  * 获取第一个文本
  *
  * @return
  */
 public final TextView getOneTv() {
  return mOneTv;
 }
 
 /**
  * 获取第二个文本
  *
  * @return
  */
 public final TextView getTwoTv() {
  return mTwoTv;
 }
 
 
 /**
  * 设置字体颜色
  *
  * @param titleColor 标题的颜色,默认是灰色
  * @param otherColor 其他的颜色,默认是蓝色
  * @param i   有2种模式,1(标题和其他颜色不一样)2(标题和其他颜色一样,取消键不一样)
  */
 public void setColor(int titleColor, int otherColor, int i) {
  if (i == 1) {
   mTitleTv.setTextColor(ContextCompat.getColor(getContext(), titleColor));
   mOneTv.setTextColor(ContextCompat.getColor(getContext(), otherColor));
   mTwoTv.setTextColor(ContextCompat.getColor(getContext(), otherColor));
  }
  if (i == 2) {
   mTitleTv.setTextColor(ContextCompat.getColor(getContext(), titleColor));
   mOneTv.setTextColor(ContextCompat.getColor(getContext(), titleColor));
   mTwoTv.setTextColor(ContextCompat.getColor(getContext(), titleColor));
   mCancelTv.setTextColor(ContextCompat.getColor(getContext(), otherColor));
  }
 }
 
 @Override
 public void onProvideKeyboardShortcuts(List<KeyboardShortcutGroup> data, @Nullable Menu menu, int deviceId) {
 
 }
}

在Activity中的应用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 private BottomDialog bottomDialog;
 private Button mButton;
 private TextView mTextView;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 mButton = (Button) findViewById(R.id.button);
 mTextView = (TextView) findViewById(R.id.textView);
 
 mButton.setOnClickListener(this);
 }
 
 @Override
 public void onClick(View v) {
 switch (v.getId()) {
  case R.id.button:
   showBottomDialog();
  break;
 }
 }
 
 /**
 * 展示
 */
 private void showBottomDialog() {
 bottomDialog = new BottomDialog(this);
 bottomDialog.setClicklistener(new BottomDialog.ClickListenerInterface() {
  @Override
  public void onTitleClick() {
 
  }
 
  @Override
  public void onOneClick() {
  mTextView.setText(bottomDialog.getOneTv().getText().toString());
  }
 
  @Override
  public void onTwoClick() {
  mTextView.setText(bottomDialog.getTwoTv().getText().toString());
  }
 });
 }
}


被封装的Dialog主要提供的方法有:修改相应的TextView文字和颜色,提供点击相应的TextView的点击事件。

这里的点击事件主要用的是回调的方法,在Dialog中定义一个接口,在点击事件调用这个接口,当在Activity中触发这个回调接口时,点击事件产生。

主要代码是:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private ClickListenerInterface clickListenerInterface;
 
public interface ClickListenerInterface {
 void onTitleClick();//点击标题TextView
 
 void onOneClick();//点击第一个TextView
 
 void onTwoClick();//点击第二个TextView
}
 
 public void setClicklistener(ClickListenerInterface clickListenerInterface) {
 this.clickListenerInterface = clickListenerInterface;
}
 
private class DialogClickListener implements View.OnClickListener {
 @Override
 public void onClick(View v) {
  switch (v.getId()) {
   case R.id.tv_dialog_title:
    clickListenerInterface.onTitleClick();
    break;
   case R.id.tv_dialog_one:
    clickListenerInterface.onOneClick();
    break;
   case R.id.tv_dialog_two:
    clickListenerInterface.onTwoClick();
    break;
   case R.id.tv_dialog_cancel:
    myDialog.dismiss();
    break;
  }
 }
}

最后说一下更改文字颜色的方法:

?
1
public void setColor(int titleColor, int otherColor, int i) {}

第一个传的颜色是修改最上面的TextView,第二个传的颜色是修改其他的文字颜色,第三个参数是表明你选用哪种模式,分别传1或2,有2种模式

  1. 标题和其他颜色不一样
  2. 标题和其他颜色一样,取消键不一样

下面是我的Github地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/lady_zhou/article/details/75213800

延伸 · 阅读

精彩推荐