1. 程式人生 > >安卓自定義彈框(Dialog)

安卓自定義彈框(Dialog)

 

1.在style檔案中建立一個style

<style name="dialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowFrame">@null</item><!-- 邊框-->
    <item name="android:windowIsFloating">true</item><!--是否顯示在activity之上-->
    <item name="android:windowNoTitle">true</item><!--沒有標題-->
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:windowIsTranslucent">false</item>
    <item name="android:windowBackground">@color/colorTransparent</item><!--背景顏色透明-->
    <item name="android:background">@color/colorTransparent</item><!--背景透明-->
    <item name="android:backgroundDimAmount">0.5</item>
</style>

2.在layout檔案中建立money_dialog(檔名)檔案

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="150dp"
    android:orientation="vertical"
    android:background="@drawable/repeat_drawable">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:textColor="@color/colorBlack"
        android:textSize="19dp"
        android:text="總金額" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="@color/colorLightGray"/>

    <EditText
        android:id="@+id/name_editText"
        android:layout_width="match_parent"
        android:layout_marginTop="25dp"
        android:layout_marginLeft="40dp"
        android:layout_marginRight="40dp"
        android:layout_height="40dp"
        android:focusable="auto"
        android:gravity="center"
        android:inputType="number"
        android:background="@drawable/name_edit_shape"/>
        <Button
            android:id="@+id/sure_btn"
            android:layout_marginTop="20dp"
            android:layout_marginBottom="20dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="40dp"
            android:layout_marginRight="40dp"
            android:textColor="@color/colorMian"
            android:gravity="center"
            android:textSize="18dp"
            android:text="確定"
            android:background="@null"/>
</LinearLayout>

3.建立MoneyDialog類繼承自Dialog

public class MoneyDialog extends Dialog implements View.OnClickListener {

    private Context context;
    private EditText money_text;
    private Button sure_button;
    private SureOnlickLisenter lisenter;

    public MoneyDialog(@NonNull Context context) {
        super(context, R.style.dialog);
        this.context = context;
        initView();
        bindViews();
    }

    public void setLisenter(SureOnlickLisenter lisenter) {
        this.lisenter = lisenter;
    }

    private void initView() {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.money_dialog,null);
        Window window = this.getWindow();
        if (window!=null){
            window.setGravity(Gravity.CENTER);
        }
        setContentView(view);
    }

    private void bindViews() {
       money_text = findViewById(R.id.name_editText);
       sure_button = findViewById(R.id.sure_btn);
       sure_button.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        String money = money_text.getText().toString();
        if (money.length()>0){
            lisenter.sureOnlcik(Float.valueOf(money));
            dismiss();
        }else {
            Toast.makeText(context,"請輸入金額",Toast.LENGTH_SHORT).show();
        }

    }

    public interface SureOnlickLisenter{
        void sureOnlcik(float money);
    }
}

super(context, R.style.dialog);設定Dialog的style否則會使用系統預設的帶標題帶框的格式。

在類方法中建立Dialog的view也就是initView方法。

另外該提示框需要傳遞資料所以聲明瞭一個介面

public interface SureOnlickLisenter{
    void sureOnlcik(float money);
}

4.在Activity或Fragment中呼叫

private void showMoneyDialog(){
        MoneyDialog dialog = new MoneyDialog(context);
        dialog.show();
        Window dialogWindow = dialog.getWindow();
        WindowManager.LayoutParams params = dialogWindow.getAttributes();
        params.width = WindowManager.LayoutParams.MATCH_PARENT;
        dialogWindow.getDecorView().setPadding(40,0,40,0);
        dialogWindow.setAttributes(params);
        dialog.setLisenter(new MoneyDialog.SureOnlickLisenter() {
            @Override
            public void sureOnlcik(float money) {
               
            }
        });
    }

點選彈框的確定按鈕則Activity中會執行sureOnlcik方法並且獲取彈框中輸入的資料。