Skip to content

PopNotification_tc

Kongzue edited this page May 17, 2024 · 4 revisions

🌐 View English Document | 简体中文文档

☁簡單通知提示 PopNotification

簡單提示 PopNotification

提供一個類似 Notification 的通知樣式提示功能,請注意,此組件並不能取代 Notification,默認不支持不能跨界面顯示(可使用懸浮窗權限設定允許),僅用於應用內通知提示,擁有更強大的自訂屬性。你可以設置文本提示、圖示、以及一個控制按鈕,並可以設置持續顯示或定義自動消失的時長。PopNotification 是非阻斷式提示,也就是說,在 PopNotification 顯示時用戶依然可以操作界面。

顯示一個簡單 PopNotification

使用以下代碼顯示一個 PopNotification:

PopNotification.show("這是一個提示");

顯示一個帶圖示的 PopNotification:

PopNotification.show(R.mipmap.img_mail_line_white, "收到一封郵件");

顯示一個帶圖示的 PopNotification 並附帶一段消息:

PopNotification.show(R.mipmap.img_mail_line_white, "這是標題", "消息內容正文");

顯示的圖示可以選擇是否染色根據亮色/暗色主題效果進行染色:

//關閉圖示染色:
PopNotification.show(R.mipmap.img_mail_line_white,"這是一個提示")
      .setAutoTintIconInLightOrDarkMode(false);

PopNotification 的使用方式和 PopTip 基本一致。

設置顯示時長

PopNotification 默認顯示 2 秒後自動消失,若要手動調整,可以調用以下方法來設置顯示時長:

//顯示 2 秒
PopNotification.show("這是一個提示").showShort();

//顯示 3.5 秒
PopNotification.show("這是一個提示").showLong();

//顯示自訂 1 秒時長(單位:毫秒)
PopNotification.show("這是一個提示").autoDismiss(1000);

不自動消失,持續顯示:

PopNotification.show("這是一個提示").noAutoDismiss();

手動關閉已顯示的 PopNotification:

PopNotification popNotification = PopNotification.show("這是一個提示").noAutoDismiss();
//手動關閉:
popNotification.dismiss();

按鈕點擊回調

按鈕回調可以透過方法進行設置:

PopNotification.show(R.mipmap.img_mail_line_white, "這是消息標題", "這是消息正文內容。")
    .showLong()
    .setButton("撤回", new OnDialogButtonClickListener<PopNotification>() {
        @Override
        public boolean onClick(PopNotification popNotification, View v) {
            //點擊“撤回”按鈕回調
            return false;
        }
	});

回調中有一個返回值,若return true 則可以點擊後不自動關閉 PopNotification。

另外,DialogX 還提供了多種設置回調和按鈕文本的方法:

//只設置按鈕文本
.setButton("按鈕文本")

//設置按鈕文本並設置回調
.setButton("確定", new OnDialogButtonClickListener<PopNotification>() {
    @Override
    public boolean onClick(PopNotification popNotification, View v) {
        toast("點擊按鈕");
        return false;
    }
});

//隱藏按鈕
.setButton(null)

請依據個人喜好隨意使用。

PopNotification 點擊回調

除了按鈕可以設置點擊回調外,也可以設置 PopNotification 的提示的點擊回調,但一旦開啟提示點擊,PopNotification 的提示文字部分將不再可以點擊穿透。

使用以下代碼設置 PopNotification 的點擊回調:

PopNotification.show("這是一個提示").setOnPopNotificationClickListener(new OnDialogButtonClickListener<PopNotification>() {
    @Override
    public boolean onClick(PopNotification baseDialog, View v) {
        //點擊 PopNotification
        return false;
    }
});

生命週期回調

想要監控對話框的生命週期,可以實現其 .setDialogLifecycleCallback(...) 介面,建議使用build()方法構建對話框:

PopNotification.build()
        .setDialogLifecycleCallback(new DialogLifecycleCallback<PopNotification>() {
            @Override
            public void onShow(PopNotification dialog) {
                //PopNotification 啟動時回調
            }
            @Override
            public void onDismiss(PopNotification dialog) {
                //PopNotification 關閉時回調
            }
        })
        .show();

PopNotification 也支持 Lifecycle,你可以使用 .getLifecycle() 獲取 Lifecycle 對象。

你也可以透過使用 new 構建實例時,override 的生命週期事件的方式來處理生命週期事務,例如:

//複寫事件示範
new PopNotification() {
    @Override
    public void onShow(PopNotification dialog) {
        //...
        tip("onShow");
    }
    @Override
    public void onDismiss(PopNotification dialog) {
        //...
        tip("onDismiss");
    }
}

你也可以使用方法 .onShow(DialogXRunnable).onDismiss(DialogXRunnable),來處理生命週期事務,例如:

PopNotification.show(...)
        .onShow(new DialogXRunnable<PopNotification>() {
            @Override
            public void run(PopNotification dialog) {
                //PopNotification show!
            }
        })
        .onDismiss(new DialogXRunnable<PopNotification>() {
            @Override
            public void run(PopNotification dialog) {
                //PopNotification dismiss!
            }
        });

自訂布局

要實現在對話框中加入自訂布局,請先準備好自訂布局文件,然後使用以下方法構建:

PopNotification.build()
        .setCustomView(new OnBindView<PopNotification>(R.layout.layout_custom_view) {
            @Override
            public void onBind(PopNotification dialog, View v) {
                //v.findViewById(...)
            }
        })
        .show();

回調參數中,v 為您給定的布局文件的實例化組件,您可以通過 v.findViewById(resId)來實例化其他子布局組件,並在 onBind 方法中設置其功能和事件回調。

自訂進入和關閉動畫

針對單次顯示的對話框動畫修改,可使用以下方法進行自訂:

PopNotification.show("這裡是正文內容。")
        //設置入場動畫資源和出場動畫資源
        .setAnimResId(R.anim.anim_dialogx_bottom_enter, R.anim.anim_dialogx_bottom_exit);

要自訂動畫文件,可以參考:預設對話框啟動動畫文件預設對話框關閉動畫文件

額外說明,除了 .setAnimResId(enterAnimResId, exitAnimResId) 外,還有 .setEnterAnimResId(enterAnimResId).setExitAnimResId(enterAnimResId) 單獨方法可選,此方法僅針對單次顯示的對話框有效。

另外你也可以通過 setEnterAnimDuration([long]) 設置入場動畫時長以及通過 .setExitAnimDuration([long]) 設置關閉動畫時長。

對 PopNotification 全局生效的的動畫修改:

你可以通過靜態屬性直接修改全局 PopNotification 的動畫:

//設置全局 PopNotification 入場動畫
PopNotification.overrideEnterAnimRes = R.anim.anim_dialogx_notification_enter;
//設置全局 PopNotification 出場動畫
PopNotification.overrideExitAnimRes = R.anim.anim_dialogx_notification_exit;
//設置全局 PopNotification 入場動畫時間
PopNotification.overrideEnterDuration = 1000;
//設置全局 PopNotification 出場動畫時間
PopNotification.overrideExitDuration = 1000;

通過自訂主題修改

您還可以通過參考自訂主題介面,完全訂製全局的動畫框默認動畫效果,具體請查閱 《自訂 DialogX 主題》

請注意這三種設置是由優先度區別的,針對單次顯示的對話框動畫修改優先度 > 對 PopNotification 全局生效的的動畫修改 > 自訂主題修改。

其他額外方法

//允許同時彈出多個 PopNotification
DialogX.onlyOnePopNotification = false;

//設置標題
.setTitle(resId/String)

//設置正文內容
.setMessage(resId/String)

//強制重新刷新界面
.refreshUI();

//關閉對話框
.dismiss();

//設置標題文字樣式
.setTitleTextInfo(TextInfo);

//設置按鈕文字樣式
.setButtonTextInfo(TextInfo);

//設置提示文字樣式
.setMessageTextInfo(TextInfo);

//獲取對話框實例化對象,您可以透過此方法更深度的訂製Dialog的功能
.getDialogImpl()

//獲取自訂布局實例
.getCustomView()
    
//設置背景顏色,強行對對話框背景進行染色,請注意參數為int類型的顏色值而非R.color的索引
.setBackgroundColor(ColorInt);

//設置對話框圓角(會裁切內容顯示)
.setRadius(float px)

//隱藏對話框(無動畫),恢復顯示請執行非靜態方法的 .show()
.hide();

//是否處於顯示狀態
.isShow()

//置頂對話框
.bringToFront()

//指定對話框顯示層級
.setThisOrderIndex(int)

DialogX.onlyOnePopNotification 設置為 false 時,可以允許 PopNotification 同時彈出多個實例,已彈出的實例會位移一段距離避開新彈出的 PopNotification 的方式顯示,如下圖所示。

onlyOnePopNotification = false

開啟此開關後,PopNotification 將一次只能顯示一個實例,新彈出實例時會自動關閉舊的實例。

跨界面顯示(實驗性)

跨界面顯示

跨界面顯示是一個實驗性功能,需要額外的懸浮窗權限(android.permission.SYSTEM_ALERT_WINDOW)配置,且啟用懸浮窗權限才可以使用,但目前因為主題擴展性考慮以及新版本的 Android 中的限制,懸浮窗 Window 在跨界面顯示在其他應用上層時無法做到點擊穿透,目前還在尋找更好的解決方案。

開啟方法:

DialogX.globalHoverWindow = true;

檢查權限及申請權限:

  1. 請先在 AndroidManifest.xml 中配置權限:

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
  2. 使用代碼檢查和申請懸浮窗權限:

    //懸浮窗權限檢查
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!Settings.canDrawOverlays(context)) {
            Toast.makeText(me, "使用 DialogX.globalHoverWindow 必須開啟懸浮窗權限", Toast.LENGTH_LONG).show();
            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
            startActivity(intent);
            return;
        }
    }
  3. 啟動 PopNotification:

    PopNotification.build()
            .setDialogImplMode(DialogX.IMPL_MODE.WINDOW)	//重要,若全局使用 Window 實現模式則不需要設置
            .setTitle("這是一條消息 " + notificationIndex)
            .setIcon(icon)
            .setButton("回復", new OnDialogButtonClickListener<PopNotification>() {
                @Override
                public boolean onClick(PopNotification baseDialog, View v) {
                    Intent intent = new Intent(me, MainActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                    startActivity(intent);
                    return false;
                }
            })
            .showLong();

此方法啟用後,當所有對話框組件使用 Window 實現模式時均可跨界面顯示。

額外組件

TextInfo

TextInfo 用於儲存基礎文本樣式設置,其包含一系列屬性和響應的 get/set 方法,例如方法解釋如下:

屬性 解釋 預設值
fontSize 字號大小,值為-1時使用默認樣式,單位:dp -1
gravity 對齊方式,值為-1時使用默認樣式,取值可使用Gravity.CENTER等對齊方式 -1
fontColor 文字顏色,值為1時使用默認樣式,取值可以用Color.rgb(r,g,b)等方式獲取 1
bold 是否粗體 false

請注意,fontColor 為 ColorInt 值,您可以使用 Color.parseColor("#4D000000") 設置一個 HEX 色值,或使用資源 getResources().getColor(R.color.black30) 設置一個顏色的資源值,請勿直接傳入資源 ID,它可能會無效。

單獨指定樣式

若你的 App 引入了多種主題,在特定場景下需要使對話框顯示為某種非全局的主體樣式,可使用 .build() 構建對話框,然後使用 .setStyle(style) 來指定主題樣式,在最後執行 .show() 命令顯示對話框,例如:

PopNotification.build()
        //或直接使用 .build(IOSStyle.style())
        .setStyle(IOSStyle.style())
        .setMessage("Message content.")
        .setButton("Button")
        .show();
Clone this wiki locally