Android Dialog仿ios9中UIAlertController控件

2020-11-05 11:15:04 浏览数 (1)

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

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

代码语言:javascript复制
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中的应用:

代码语言:javascript复制
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中触发这个回调接口时,点击事件产生。

主要代码是:

代码语言:javascript复制
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;
}
}
}

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

代码语言:javascript复制
public void setColor(int titleColor, int otherColor, int i) {}

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

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

下面是我的Github地址

以上就是本文的全部内容,希望对大家的学习有所帮助。

0 人点赞