时间:2021-01-24 11:08:39 | 栏目:Android代码 | 点击:次
最近因为项目需要,用Android Dialog仿ios9中的UIAlertController控件,第一次对自定义控件进行封装,请大家多多指教
如图所示,当我封装的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<KeyboardShortcutGroup> 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种模式
下面是我的Github地址