BottomPopUpDialog底部彈出框的實現(xiàn)

BottomPopUpDialog底部彈出框的實現(xiàn)

這是一個之前實現(xiàn)的簡單效果,類似于ios底部彈出框,所以想寫一篇博客記錄一下寺谤。

效果如圖:

使用 DialogFragment

當我要實現(xiàn)這個效果的時候隙畜,首先想到的是 DialogFragment ,因為可以使用其生命周期來管理各種事件的處理,以及通過 onCreateView 或者 onCreateDIalog 來自定義視圖东揣,方便需求的變化和功能的擴展践惑。

如果不了解 DialogFragment 的話,可以去看看相關(guān)資料嘶卧,這里不做詳述哈尔觉。

我們來看看底部彈出框的布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/transparent"
    android:gravity="bottom">


    <com.shadow.bottompopupdialog.MaxHeightScrollView
        android:id="@+id/sl_root"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:background="@drawable/round_rect_white"
        android:padding="2dp">

        <LinearLayout
            android:id="@+id/pop_dialog_content_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/round_rect_white"
            android:orientation="vertical">
        </LinearLayout>
    </com.shadow.bottompopupdialog.MaxHeightScrollView>

    <TextView
        android:id="@+id/cancel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/sl_root"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="5dp"
        android:background="@drawable/round_rect_white"
        android:gravity="center"
        android:minHeight="55dp"
        android:padding="10dp"
        android:text="@string/cancel"
        android:textColor="@color/text_color"
        android:textSize="18sp" />


</RelativeLayout>

如代碼所示,主要布局是 ScrollView 里面嵌套一個 LinearLayout 布局芥吟,用來在代碼里添加item侦铜。

別忘了這個自定義 MaxHeightScrollView

上面的布局中我使用的是 MaxHeightScrollView ,自定義 ScrollView 是想要顯示最高的高度為屏幕的三分之二钟鸵。


public class MaxHeightScrollView extends ScrollView {


    public MaxHeightScrollView(Context context) {
        super(context);

    }

    public MaxHeightScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Context context = getContext();
        if (null != context) {
            int screenHeight = getScreenHeight(context);
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(screenHeight * 2 / 3, MeasureSpec.AT_MOST);
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    /**
     * 獲取屏幕高度
     */
    private int getScreenHeight(Context context) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        return metrics.heightPixels;
    }


}


BottomPopUpDialog 詳情

先來看看一些view的細節(jié)

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        //該方法需要放在onViewCreated比較合適, 若在 onStart 在部分機型會出現(xiàn)閃爍的情況
        getDialog().getWindow().setBackgroundDrawableResource(mBackgroundShadowColor);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //去掉title
        setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Holo_Light_NoActionBar);
    }

如代碼所示钉稍,在 onViewCreated 里設(shè)置彈窗的背景陰影顏色,默認是黑色透明的顏色棺耍。

mBackgroundShadowColor = R.color.transparent_70

而且可以在代碼中設(shè)置它的顏色贡未。


   /**
    * 設(shè)置dialog背景陰影顏色
    */
   public BottomPopUpDialog setBackgroundShadowColor(int color) {
       mBackgroundShadowColor = color;
       return this;
   }


setStyle是為了去掉title,當然也可以使用

getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE)

可調(diào)用的公共方法


    /**
     * 設(shè)置item數(shù)據(jù)
     */
    public BottomPopUpDialog setDialogData(String[] dataArray) {
        mDataArray = dataArray;
        return this;
    }

    /**
     * 設(shè)置監(jiān)聽item監(jiān)聽器
     */
    public BottomPopUpDialog setItemOnListener(BottomPopDialogOnClickListener listener) {
        mListener = listener;
        return this;
    }


    /**
     * 設(shè)置字體顏色
     *
     * @param index item的索引
     * @param color res color
     */
    public BottomPopUpDialog setItemTextColor(int index, int color) {
        mColorArray.put(index, color);
        return this;
    }

    /**
     * 設(shè)置item分隔線顏色
     */
    public BottomPopUpDialog setItemLineColor(int color) {
        mLineColor = color;
        return this;
    }

    /**
     * 設(shè)置是否點擊回調(diào)取消dialog
     */
    public BottomPopUpDialog setCallBackDismiss(boolean dismiss) {
        mIsCallBackDismiss = dismiss;
        return this;
    }


設(shè)置相應(yīng)的數(shù)據(jù)后會在 onCreateView 里初始化數(shù)據(jù)蒙袍,這些公共方法是必須要在dialogfragment.show() 之前調(diào)用俊卤,因為只有在show方法調(diào)用之后,dialogfragment 才會初始化害幅,開始相應(yīng)的生命周期消恍。

初始化數(shù)據(jù)

 private void initItemView() {
        //循環(huán)添加item
        for (int i = 0; i < mDataArray.length; i++) {
            final PopupDialogItem dialogItem = new PopupDialogItem(getContext());
            dialogItem.refreshData(mDataArray[i]);

            //最后一項隱藏分割線
            if (i == mDataArray.length - 1) {
                dialogItem.hideLine();
            }

            //設(shè)置字體顏色
            if (mColorArray.size() != 0 && mColorArray.get(i) != 0) {
                dialogItem.setTextColor(mColorArray.get(i));
            }

            if (mLineColor != 0) {
                dialogItem.setLineColor(mLineColor);
            }

            mContentLayout.addView(dialogItem);

            dialogItem.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mListener.onDialogClick(dialogItem.getItemContent());
                    if (mIsCallBackDismiss) dismiss();
                }
            });
        }
    }

可以從代碼中看到 LinearLayout 里循環(huán)添加的 item 是 PopupDialogItem ,它其實主體就是一個 TextView 矫限,負責(zé)顯示
String數(shù)組里的內(nèi)容哺哼。

BottomPopUpDialog 使用

  BottomPopUpDialog dialog = new BottomPopUpDialog()
                            .setDialogData(getResources().getStringArray(R.array.popup_array))
                            .setItemTextColor(2, R.color.colorAccent)
                            .setItemTextColor(4, R.color.colorAccent)
                            .setCallBackDismiss(true)
                            .setItemOnListener(new BottomPopUpDialog.BottomPopDialogOnClickListener() {
                                @Override
                                public void onDialogClick(String tag) {
                                    Snackbar.make(view, tag, Snackbar.LENGTH_LONG)
                                            .setAction("Action", null).show();
                                }
                            });
                    dialog.show(getSupportFragmentManager(), "tag");

這些方法之前介紹過,setItemTextColor 可以重復(fù)設(shè)置顏色叼风。

最后

這是一個簡單的小組件取董,記錄一下編程的思路。

點擊這里有源碼 GitHub地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末无宿,一起剝皮案震驚了整個濱河市茵汰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孽鸡,老刑警劉巖蹂午,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異彬碱,居然都是意外死亡豆胸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門巷疼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晚胡,“玉大人,你說我怎么就攤上這事」琅蹋” “怎么了瓷患?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遣妥。 經(jīng)常有香客問我擅编,道長,這世上最難降的妖魔是什么箫踩? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任爱态,我火速辦了婚禮,結(jié)果婚禮上班套,老公的妹妹穿的比我還像新娘肢藐。我一直安慰自己,他們只是感情好吱韭,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鱼的,像睡著了一般理盆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凑阶,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天猿规,我揣著相機與錄音,去河邊找鬼宙橱。 笑死姨俩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的师郑。 我是一名探鬼主播环葵,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宝冕!你這毒婦竟也來了张遭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤地梨,失蹤者是張志新(化名)和其女友劉穎菊卷,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宝剖,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡洁闰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了万细。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扑眉。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出襟雷,到底是詐尸還是另有隱情刃滓,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布耸弄,位于F島的核電站咧虎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏计呈。R本人自食惡果不足惜砰诵,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捌显。 院中可真熱鬧茁彭,春花似錦、人聲如沸扶歪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽善镰。三九已至妹萨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炫欺,已是汗流浹背乎完。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留品洛,地道東北人树姨。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像桥状,于是被迫代替她去往敵國和親帽揪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,322評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫岛宦、插件台丛、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,124評論 4 61
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,449評論 0 17
  • 歷史上金融業(yè)每一次重大的突破侠坎,都離不開科學(xué)技術(shù)的突破。2014年以來裙盾,人們把人工智能在金融界的應(yīng)用取了一個能夠代表...
    whoogaoqiao閱讀 640評論 0 0
  • 青春好像就是用來教你體驗遺憾的实胸,未經(jīng)世事的年紀總是會懷抱滿腔熱情最終卻撲了空他嫡。回想那些不懂事的時光庐完,輕而易舉就能記...
    奧利奧lrm閱讀 208評論 0 0