Android Dialog仿ios9中UIAlertController控件
最近因?yàn)轫?xiàng)目需要,用Android Dialog仿ios9中的UIAlertController控件,第一次對(duì)自定義控件進(jìn)行封裝,請(qǐng)大家多多指教

如圖所示,當(dāng)我封裝的Dialog被觸發(fā)時(shí),從底部彈出,點(diǎn)擊取消鍵整個(gè)彈框會(huì)消失,當(dāng)點(diǎn)擊不同的TextView會(huì)有相應(yīng)的點(diǎn)擊事件發(fā)生,目前只寫了三個(gè)能被點(diǎn)擊的TextView(以后會(huì)改為可以動(dòng)態(tài)添加個(gè)數(shù))。
以下代碼是我封裝的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();//點(diǎn)擊標(biāo)題TextView
void onOneClick();//點(diǎn)擊第一個(gè)TextView
void onTwoClick();//點(diǎn)擊第二個(gè)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);
//填充對(duì)話框的布局
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());
//將布局設(shè)置給Dialog
myDialog.setContentView(view);
//獲取當(dāng)前Activity所在的窗體
Window dialogWindow = myDialog.getWindow();
//設(shè)置Dialog從窗體底部彈出
dialogWindow.setGravity(Gravity.BOTTOM);
//獲得窗體的屬性
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.width = (int) (dialogWindow.getWindowManager().getDefaultDisplay().getWidth() * 0.95);
lp.y = 20; //設(shè)置Dialog距離底部的距離
dialogWindow.setAttributes(lp); //將屬性設(shè)置給窗體
myDialog.show();//顯示對(duì)話框
}
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();
}
}
/**
* 設(shè)置標(biāo)題欄文本文字
*
* @param stringId
* @see #setTitleText(String)
*/
public void setTitleText(@StringRes int stringId) {
setTitleText(getContext().getString(stringId));
}
/**
* 設(shè)置標(biāo)題欄文本文字
*
* @param text
*/
public void setTitleText(String text) {
mTitleTv.setText(text);
mTitleTv.setVisibility(View.VISIBLE);
}
/**
* 設(shè)置第一個(gè)TextView文字
*
* @param stringId
*/
public void setOneText(@StringRes int stringId) {
setOneText(getContext().getString(stringId));
}
/**
* 設(shè)置第一個(gè)TextView文字
*
* @param text
*/
public void setOneText(String text) {
mOneTv.setText(text);
mOneTv.setVisibility(View.VISIBLE);
}
/**
* 設(shè)置第二個(gè)TextView文字
*
* @param stringId
*/
public void setTwoText(@StringRes int stringId) {
setTwoText(getContext().getString(stringId));
}
/**
* 設(shè)置第二個(gè)TextView文字
*
* @param text
*/
public void setTwoText(String text) {
mTwoTv.setText(text);
mTwoTv.setVisibility(View.VISIBLE);
}
/**
* 獲取標(biāo)題欄文本
*
* @return
*/
public final TextView getTitleTv() {
return mTitleTv;
}
/**
* 獲取第一個(gè)文本
*
* @return
*/
public final TextView getOneTv() {
return mOneTv;
}
/**
* 獲取第二個(gè)文本
*
* @return
*/
public final TextView getTwoTv() {
return mTwoTv;
}
/**
* 設(shè)置字體顏色
*
* @param titleColor 標(biāo)題的顏色,默認(rèn)是灰色
* @param otherColor 其他的顏色,默認(rèn)是藍(lán)色
* @param i 有2種模式,1(標(biāo)題和其他顏色不一樣)2(標(biāo)題和其他顏色一樣,取消鍵不一樣)
*/
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中的應(yīng)用:
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主要提供的方法有:修改相應(yīng)的TextView文字和顏色,提供點(diǎn)擊相應(yīng)的TextView的點(diǎn)擊事件。
這里的點(diǎn)擊事件主要用的是回調(diào)的方法,在Dialog中定義一個(gè)接口,在點(diǎn)擊事件調(diào)用這個(gè)接口,當(dāng)在Activity中觸發(fā)這個(gè)回調(diào)接口時(shí),點(diǎn)擊事件產(chǎn)生。
主要代碼是:
private ClickListenerInterface clickListenerInterface;
public interface ClickListenerInterface {
void onTitleClick();//點(diǎn)擊標(biāo)題TextView
void onOneClick();//點(diǎn)擊第一個(gè)TextView
void onTwoClick();//點(diǎn)擊第二個(gè)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) {}
第一個(gè)傳的顏色是修改最上面的TextView,第二個(gè)傳的顏色是修改其他的文字顏色,第三個(gè)參數(shù)是表明你選用哪種模式,分別傳1或2,有2種模式
- 標(biāo)題和其他顏色不一樣
- 標(biāo)題和其他顏色一樣,取消鍵不一樣
下面是我的Github地址
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)ImageView圖片縮放和拖動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)ImageView圖片縮放和拖動(dòng)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Android 繪制多級(jí)樹形選擇列表實(shí)例代碼
這篇文章主要介紹了Android 繪制多級(jí)樹形選擇列表的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Android復(fù)選框CheckBox與開關(guān)按鈕Switch及單選按鈕RadioButton使用示例詳解
這篇文章主要介紹了Android復(fù)選框CheckBox與開關(guān)按鈕Switch及單選按鈕RadioButton使用示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09
Android仿視頻加載旋轉(zhuǎn)小球動(dòng)畫效果的實(shí)例代碼
這篇文章主要介紹了Android仿視頻加載旋轉(zhuǎn)小球動(dòng)畫效果的實(shí)例代碼,文中給大家提到了PathMeasure的用法,介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
Android編程實(shí)現(xiàn)仿心跳動(dòng)畫效果的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)仿心跳動(dòng)畫效果的方法,實(shí)例分析了Android基于線程實(shí)現(xiàn)動(dòng)畫過度效果的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
Material Design系列之Behavior上滑顯示返回頂部按鈕
這篇文章主要為大家詳細(xì)介紹了Material Design系列之Behavior上滑顯示返回頂部按鈕的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
flutter實(shí)現(xiàn)磨砂玻璃效果實(shí)例詳解
這篇文章主要為大家介紹了flutter實(shí)現(xiàn)磨砂玻璃效果實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Ubuntu中為Android實(shí)現(xiàn)Application Frameworks層增加硬件訪問服務(wù)
本文主要介紹Android實(shí)現(xiàn) Application Frameworks層增加硬件訪問服務(wù),這里對(duì)實(shí)現(xiàn)增加硬件訪問服務(wù)的功能做出了詳細(xì)的工作流程,并提供示例代碼,有需要的小伙伴參考下2016-08-08
Android 截取手機(jī)屏幕兩種實(shí)現(xiàn)方法
這篇文章主要介紹了Android 截取手機(jī)屏幕兩種實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2017-05-05
Android實(shí)現(xiàn)伸縮彈力分布菜單效果的示例
本文介紹下在Android中實(shí)現(xiàn)伸縮彈力分布菜單效果。這種效果比較炫酷,有需要的朋友可以參考一下。2016-10-10

