自定義控制元件(Dialog篇)
阿新 • • 發佈:2019-02-13
自定義控制元件實現方式
本文中初步討論了關於原生Dialog實現方式,自定義Dialog樣式實現以及注意細節
基於Android Studio API 23開發
- 原生Dialog三種樣式實現方式
- 自定義Dialog實現方式
- 結束語
原生Dialog實現方式
程式碼塊
原生Dialog實現方式樣式一L提示框:
實現方式一:
AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到構造器
builder.setTitle("提示"); //設定標題
builder.setMessage("是否確認退出?" ); //設定內容
builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { //設定確定按鈕
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss(); //關閉dialog
}
});
builder.setNegativeButton("取消" , new DialogInterface.OnClickListener() { //設定取消按鈕
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.setNeutralButton("忽略", new DialogInterface.OnClickListener() {//設定忽略按鈕
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
//引數都設定完成了,建立並顯示出來 (三個按鈕本身是空作用的,需要人為賦值)
builder.create().show();
實現方式二:
DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
switch(which){
case Dialog.BUTTON_POSITIVE:
break;
case Dialog.BUTTON_NEGATIVE:
break;
case Dialog.BUTTON_NEUTRAL:
break;
}
}
};
//dialog引數設定
AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到構造器
builder.setTitle("提示"); //設定標題
builder.setMessage("是否確認退出?"); //設定內容
builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可
builder.setPositiveButton("確認",dialogOnclicListener);
builder.setNegativeButton("取消", dialogOnclicListener);
builder.setNeutralButton("忽略", dialogOnclicListener);
builder.create().show();
原生Dialog實現方式樣式二L列表選項:
final String items[]={"路飛","娜美","索隆"};
//dialog引數設定
AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到構造器
builder.setTitle("提示"); //設定標題
//builder.setMessage("是否確認退出?"); //設定內容
builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可
//設定列表顯示,注意設定了列表顯示就不要設定builder.setMessage()了,否則列表不起作用。
builder.setItems(items,new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//which屬性是items陣列的下標
}
});
builder.setPositiveButton("確定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
原生Dialog實現方式樣式三L單選對話方塊:
final String items[]={"男","女"};
AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到構造器
builder.setTitle("提示"); //設定標題
builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可
builder.setSingleChoiceItems(items,0,new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//dialog.dismiss();
//setSingleChoiceItems引數中,0表示預設選中是第一個,如圖所示是預設選中“男”。
}
});
builder.setPositiveButton("確定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
原生Dialog實現方式樣式三L多選對話方塊:
final String items[]={"喬巴","山治","烏索普"};
final boolean selected[]={true,false,true};
AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到構造器
builder.setTitle("提示"); //設定標題
builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可
builder.setMultiChoiceItems(items,selected,new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
// dialog.dismiss();
//which是點選的item下標,在這裡可以保留下標的狀態用於下次呈現
// android會自動根據你選擇的改變selected陣列的值。
}
});
builder.setPositiveButton("確定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
自定義Dialog實現方式
程式碼塊
public class CouponDialog extends Dialog {
private Context context;
@SuppressLint("InflateParams")
public CouponDialog (final Context context){
super(context, R.style.DialogStyle);
this.context=context;
View view = LayoutInflater.from(context).inflate(R.layout.layout_cash_coupon_dialog, null);//設定相關佈局
setContentView(view);
// 設定視窗大小
Window mWindow = getWindow();
WindowManager.LayoutParams lp = mWindow.getAttributes();
if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {// 豎屏
//這裡必須設定相關的高度和寬度,如果不設定將不會顯示出來
lp.width = getScreenWidth(context);
lp.height = getScreenHeight(context)/2;
} else {
lp.width = getScreenHeight(context);
}
mWindow.setAttributes(lp);
// 設定可以動畫
mWindow.setWindowAnimations(R.style.dialogAnimBottomAndFade);
// 位置設定在底部--顯示位置(Gravity.CENTER)中間
mWindow.setGravity(Gravity.BOTTOM);
// 設定可取消
setCancelable(true);
setCanceledOnTouchOutside(true);
}
public static int getScreenWidth(Context context){
DisplayMetrics dm = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.widthPixels;
}
public static int getScreenHeight(Context context){
DisplayMetrics dm = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.heightPixels;
}
//如果想做相關點選事件在初始化中進行物件以及資料的初始化
}
styles裡的自定義Dialog配置
<!--自定義dialog-->
<style name="DialogStyle" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<!-- 邊框-->
<item name="android:windowIsFloating">true</item>
<!--是否浮現在activity之上-->
<item name="android:windowIsTranslucent">false</item>
<!--半透明-->
<item name="android:windowNoTitle">true</item>
<!--無標題-->
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
</style>
<!--自定義dialog的動畫效果-->
<style name="dialogAnim" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/dialog_show</item>
<item name="android:windowExitAnimation">@anim/dialog_dismiss</item>
</style>
anim中建立dialog_show和dialog_dismiss
dialog_show
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="100%p"
android:duration="500" />
</set>
dialog_dismiss
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:toYDelta="100%p"
android:duration="500" />
</set>
經過資料配置之後可以顯示比較複雜的效果圖
結束語
對於原生Dialog的樣式無法進行重繪,並且根據Android Studio中使用的API不同,很可能會發生樣式的變化。結合多方面因素考慮還是需要自定義一個Dialog介面用於複寫比較好,不但可以保持頁面的整潔性,還可以保證頁面的統一性。