1. 程式人生 > >TDialog的基本使用,輕鬆實現Android任意彈窗

TDialog的基本使用,輕鬆實現Android任意彈窗

TDialog是用於實現Android彈窗的框架

一、先看效果圖

二、程式碼實現

1.在app模組下的build.gradle引入TDialog

implementation 'com.timmy.tdialog:tdialog:1.3.1'

2.建立彈窗佈局dialog.xml,這裡根據自己的需要寫

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <ImageView
        android:id="@+id/bg"
        android:src="@drawable/bg_dialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintVertical_bias="0.6"
        app:layout_constraintHorizontal_bias="0.55"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <Button
        android:id="@+id/cancel"
        android:text="Cancel"
        android:textAllCaps="false"
        android:background="#00000000"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="@id/bg"
        app:layout_constraintRight_toRightOf="@id/bg"
        app:layout_constraintBottom_toBottomOf="@id/bg"
        app:layout_constraintHorizontal_bias="0.88"
        app:layout_constraintVertical_bias="0.9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/ok"
        android:text="OK"
        android:textAllCaps="false"
        android:background="#00000000"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="@id/bg"
        app:layout_constraintRight_toLeftOf="@id/cancel"
        app:layout_constraintVertical_bias="0.9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</android.support.constraint.ConstraintLayout>

附上背景圖:

3.程式碼中使用TDialog:

new TDialog.Builder(getSupportFragmentManager())
        .setLayoutRes(R.layout.dialog)    //設定彈窗展示的xml佈局
        .setScreenWidthAspect(MainActivity.this, 0.8f)   //設定彈窗寬度(引數aspect為螢幕寬度比例 0 - 1f)
        .setScreenHeightAspect(MainActivity.this, 0.3f)  //設定彈窗高度(引數aspect為螢幕寬度比例 0 - 1f)
        .addOnClickListener(R.id.ok,R.id.cancel)
        .setOnViewClickListener(new OnViewClickListener() {
            @Override
            public void onViewClick(BindViewHolder viewHolder, View view, TDialog tDialog) {
                switch (view.getId()){
                    case R.id.ok:
                        TextView text = viewHolder.getView(R.id.text);
                        text.setText("點選了ok");
                        break;
                    case R.id.cancel:
                        tDialog.dismiss();
                        break;
                }
            }
        })
        .create()   //建立TDialog
        .show();    //展示

根據螢幕比例設定彈窗的寬高,需要新增點選事件的話,先使用addOnClickListener將控制元件id傳入,再在setOnViewClickListener中根據點選的id觸發相應的事件。需要用到佈局中的控制元件的話,使用viewHolder.getView(R.id.xxx)找到控制元件,再進行相應的操作即可。這裡作者也提供了另一種操作方式,如上圖中的

TextView text = viewHolder.getView(R.id.text);
text.setText("點選了ok");

也可以寫成:

viewHolder.setText(R.id.text,"點選了ok");

4.如果在開啟彈窗時需要進行一些初始化操作,在TDialog的create方法之前連綴setOnBindViewListener即可。

如果要在彈窗消失時進行一些操作,在TDialog的create方法之前連綴setOnDismissListener即可。程式碼如下:

new TDialog.Builder(getSupportFragmentManager())
        .setLayoutRes(R.layout.dialog)    //設定彈窗展示的xml佈局
        .setScreenWidthAspect(MainActivity.this, 0.8f)   //設定彈窗寬度(引數aspect為螢幕寬度比例 0 - 1f)
        .setScreenHeightAspect(MainActivity.this, 0.3f)  //設定彈窗高度(引數aspect為螢幕寬度比例 0 - 1f)
        .setOnBindViewListener(new OnBindViewListener() {
            @Override
            public void bindView(BindViewHolder viewHolder) {
                TextView text = viewHolder.getView(R.id.text);
                text.setText("初始化");
            }
        })
        .setOnDismissListener(new DialogInterface.OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialog) {
                Toast.makeText(MainActivity.this, "cancel", Toast.LENGTH_SHORT).show();
            }
        })
        .addOnClickListener(R.id.ok,R.id.cancel)
        .setOnViewClickListener(new OnViewClickListener() {
            @Override
            public void onViewClick(BindViewHolder viewHolder, View view, TDialog tDialog) {
                switch (view.getId()){
                    case R.id.ok:
                        viewHolder.setText(R.id.text,"點選了ok");
                        break;
                    case R.id.cancel:
                        tDialog.dismiss();
                        break;
                }
            }
        })
        .create()   //建立TDialog
        .show();    //展示

MainActivity的佈局只有一個button,很簡單,這裡就不貼布局程式碼了,看一下MainActivity的完整程式碼:

package com.cpx.tdialog;

import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.timmy.tdialog.TDialog;
import com.timmy.tdialog.base.BindViewHolder;
import com.timmy.tdialog.listener.OnBindViewListener;
import com.timmy.tdialog.listener.OnViewClickListener;

public class MainActivity extends AppCompatActivity {

    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new TDialog.Builder(getSupportFragmentManager())
                        .setLayoutRes(R.layout.dialog)    //設定彈窗展示的xml佈局
                        .setScreenWidthAspect(MainActivity.this, 0.8f)   //設定彈窗寬度(引數aspect為螢幕寬度比例 0 - 1f)
                        .setScreenHeightAspect(MainActivity.this, 0.3f)  //設定彈窗高度(引數aspect為螢幕寬度比例 0 - 1f)
                        .setOnBindViewListener(new OnBindViewListener() {
                            @Override
                            public void bindView(BindViewHolder viewHolder) {
                                TextView text = viewHolder.getView(R.id.text);
                                text.setText("初始化");
                            }
                        })
                        .setOnDismissListener(new DialogInterface.OnDismissListener() {
                            @Override
                            public void onDismiss(DialogInterface dialog) {
                                Toast.makeText(MainActivity.this, "cancel", Toast.LENGTH_SHORT).show();
                            }
                        })
                        .addOnClickListener(R.id.ok,R.id.cancel)
                        .setOnViewClickListener(new OnViewClickListener() {
                            @Override
                            public void onViewClick(BindViewHolder viewHolder, View view, TDialog tDialog) {
                                switch (view.getId()){
                                    case R.id.ok:
                                        viewHolder.setText(R.id.text,"點選了ok");
                                        break;
                                    case R.id.cancel:
                                        tDialog.dismiss();
                                        break;
                                }
                            }
                        })
                        .create()   //建立TDialog
                        .show();    //展示
            }
        });

    }
}

這樣就實現了文章開始時的效果。

5.設定彈窗動畫,在create之前連綴setDialogAnimationRes即可

.setDialogAnimationRes(R.style.animate_dialog)  //設定彈窗動畫

後話

如果想用Activity做彈窗,可以檢視另一篇文章:

使用彈窗風格的Activity實現萬能彈窗:

通過Activity實現的Dialog,只需要在啟動Activity時設定:overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right);

即可實現Dialog進出場動畫,非常的方便。