android ios dialog,Android Dialog仿ios9中UIAlertController控件

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

0c8cb81d98611f581afbb48972679cf7.gif

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

以下代码是我封装的BottomDialog:

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 data, @Nullable Menu menu, int deviceId) {

}

}

在Activity中的应用:

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中触发这个回调接口时,点击事件产生。

主要代码是:

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;

}

}

}

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

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

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

标题和其他颜色不一样

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值