AndroidX 基礎(chǔ)彈框DataBinding+DialogFragment使用封裝

Android 基礎(chǔ)彈框DataBinding+DialogFragment的使用封裝

針對目前彈框的使用比較頻繁囱淋,現(xiàn)在動(dòng)手封裝一個(gè)彈框的基類建炫,使用DataBinding+DialogFragment豹芯,希望能夠幫到大家幸海。
1.onCreate()方法中添加Style.

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NORMAL,R.style.BaseDialogStyle);
}

BaseDialogStyle代碼如下(大家根據(jù)自己的需求進(jìn)行修改):

<style name="BaseDialogStyle" parent="Theme.MaterialComponents.DayNight.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowFrame">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowTranslucentStatus">true</item><!-- 解決全屏?xí)r狀態(tài)欄變黑 -->
    <item name="android:backgroundDimEnabled">true</item>   <!-- 是否允許背景模糊 -->
    <item name="android:windowIsTranslucent">true</item>    <!-- 是否半透明 -->
    <item name="android:windowIsFloating">true</item>       <!-- 是否浮現(xiàn)在activity之上 -->
    <item name="android:windowContentOverlay">@null</item>  <!-- 是否有遮蓋 -->
    <item name="android:backgroundDimAmount">0.8</item>     <!-- 設(shè)置背景模糊的透明度-->
</style>
  1. 彈框核心代碼:

     @Nullable
     @Override
     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
         mContext = getActivity();
         if (getDialog()!=null) getDialog().setCanceledOnTouchOutside(isOnTouchOutSide);
         viewBinding =  DataBindingUtil.inflate(inflater,layoutResId(),container,false);
         viewBinding.setLifecycleOwner(this);
         initData();
         return viewBinding.getRoot();
    }
    

3.在onStart()方法中可以動(dòng)態(tài)設(shè)置寬高和透明度以及彈框的位置(上下左右):

@Override
public void onStart() {
    super.onStart();
   setSite(viewSite);
}

private void setSite(int site) {
    Window mWindow = Objects.requireNonNull(getDialog()).getWindow();
    WindowManager.LayoutParams mLayoutParams = mWindow.getAttributes();
    mLayoutParams.width = windowWidth;
    mLayoutParams.height = windowHeight;
    mLayoutParams.gravity = site;
    mWindow.setAttributes(mLayoutParams);
    mWindow.setDimAmount(alpha);// 0~1 , 1表示完全昏暗
}

4.根據(jù)自己的需求封裝toast,例如:

protected void showToast(CharSequence msg){
    Toast.makeText(mContext,msg, Toast.LENGTH_SHORT).show();
}

protected void showToast(@StringRes int msg){
    Toast.makeText(mContext,msg, Toast.LENGTH_SHORT).show();
}

5.完整代碼如下:

@SuppressLint("ValidFragment")
public abstract class BaseDialog<D extends ViewDataBinding> extends DialogFragment {
protected D viewBinding;
protected Context mContext;
private int viewSite = Gravity.CENTER;//布局位置
private boolean isOnTouchOutSide = false;
private float alpha = 0.8f;
private int windowWidth = ViewGroup.LayoutParams.MATCH_PARENT;
private int windowHeight = ViewGroup.LayoutParams.MATCH_PARENT;
public BaseDialog() {
    super();
}

/**
 * 是否點(diǎn)擊外部消失
 * @param isOnTouchOutSide
 */
public BaseDialog(boolean isOnTouchOutSide) {
    this.isOnTouchOutSide = isOnTouchOutSide;
}

/**
 * 布局位置
 * @param site
 */
public BaseDialog(int site) {
    viewSite = site;
}
public BaseDialog(int site, boolean isOnTouchOutSide) {
    this(isOnTouchOutSide);
    viewSite = site;
}

public BaseDialog(float alpha, int windowWidth, int windowHeight) {
    this.alpha = alpha;
    this.windowWidth = windowWidth;
    this.windowHeight = windowHeight;
}

public BaseDialog(int site, int windowWidth, int windowHeight) {
    this.viewSite = site;
    this.windowWidth = windowWidth;
    this.windowHeight = windowHeight;
}
protected abstract @LayoutRes
int layoutResId();

protected abstract void initData();

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NORMAL,R.style.BaseDialogStyle);
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    mContext = getActivity();
    if (getDialog()!=null){
        getDialog().setCanceledOnTouchOutside(isOnTouchOutSide);
        //禁止返回關(guān)閉彈框可在此處處理
//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//                getDialog().setOnKeyListener(new DialogInterface.OnKeyListener()   {
//                    @Override
//                    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
//                        if (keyCode == 4) return true;
//                        Log.i(TAG, "onKey: "+keyCode);
//                        return false;
//                    }
//                });
//            }
    }
    viewBinding =  DataBindingUtil.inflate(inflater,layoutResId(),container,false);
    viewBinding.setLifecycleOwner(this);
    initData();
    return viewBinding.getRoot();
}

public boolean isOnTouchOutSide() {
    return isOnTouchOutSide;
}

public BaseDialog setOnTouchOutSide(boolean onTouchOutSide) {
    isOnTouchOutSide = onTouchOutSide;
    if (getDialog() != null) {
        getDialog().setCanceledOnTouchOutside(onTouchOutSide);
    }
    return this;
}

public int getViewSite() {
    return viewSite;
}

public BaseDialog setViewSite(int viewSite) {
    this.viewSite = viewSite;
    setSite(viewSite);
    return this;
}

@Override
public void onStart() {
    super.onStart();
   setSite(viewSite);
}

private void setSite(int site) {
    Window mWindow = Objects.requireNonNull(getDialog()).getWindow();
    WindowManager.LayoutParams mLayoutParams = mWindow.getAttributes();
    mLayoutParams.width = windowWidth;
    mLayoutParams.height = windowHeight;
    mLayoutParams.gravity = site;
    mWindow.setAttributes(mLayoutParams);
    mWindow.setDimAmount(alpha);// 0~1 , 1表示完全昏暗
}

protected void showToast(CharSequence msg){
    Toast.makeText(mContext,msg, Toast.LENGTH_SHORT).show();
//        ToastUtils.showShort(mContext,msg);
}

protected void showToast(@StringRes int msg){
    Toast.makeText(mContext,msg, Toast.LENGTH_SHORT).show();
//        ToastUtils.showShort(mContext,msg);
}

最后站蝠,希望對大家有所幫助揽祥,如果有不對的地方,歡迎大家指正桨醋。謝謝棚瘟!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市喜最,隨后出現(xiàn)的幾起案子偎蘸,更是在濱河造成了極大的恐慌,老刑警劉巖瞬内,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迷雪,死亡現(xiàn)場離奇詭異,居然都是意外死亡虫蝶,警方通過查閱死者的電腦和手機(jī)章咧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秉扑,“玉大人慧邮,你說我怎么就攤上這事≈勐剑” “怎么了误澳?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秦躯。 經(jīng)常有香客問我忆谓,道長,這世上最難降的妖魔是什么踱承? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任倡缠,我火速辦了婚禮,結(jié)果婚禮上茎活,老公的妹妹穿的比我還像新娘昙沦。我一直安慰自己,他們只是感情好载荔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布盾饮。 她就那樣靜靜地躺著,像睡著了一般懒熙。 火紅的嫁衣襯著肌膚如雪丘损。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天工扎,我揣著相機(jī)與錄音徘钥,去河邊找鬼。 笑死肢娘,一個(gè)胖子當(dāng)著我的面吹牛呈础,可吹牛的內(nèi)容都是我干的舆驶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼猪落,長吁一口氣:“原來是場噩夢啊……” “哼贞远!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起笨忌,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤蓝仲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后官疲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袱结,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年途凫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垢夹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡维费,死狀恐怖果元,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情犀盟,我是刑警寧澤而晒,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站阅畴,受9級特大地震影響倡怎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贱枣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一监署、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纽哥,春花似錦钠乏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至摔笤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垦写,已是汗流浹背吕世。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梯投,地道東北人命辖。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓况毅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尔艇。 傳聞我的和親對象是個(gè)殘疾皇子尔许,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容