1. 程式人生 > >Android 繼承DialogFragment實現對話方塊

Android 繼承DialogFragment實現對話方塊

前言

在重構專案UI時,由於需要重新改下對話方塊介面,然後期望效果圖如下:
這裡寫圖片描述
雖然簡單,但是感覺很久都沒動手寫UI,差不多都忘了[尷尬],所以搞起來也是稍微耗了點時間,於是打算記錄下。

問題

繼承DialogFragment後,如果什麼都不處理,則效果如下:
這裡寫圖片描述

與期望的效果差別:
1.對話方塊頂部有白色塊
2.對話方塊頂部有藍色線條(部分5.0以下手機)
3.對話方塊左右邊緣與螢幕邊緣有間隙
4.背景不是完全透明
5.頂部新增陰影

1.去除對話方塊頂部有白色塊
頂部多出的白色塊可以通過呼叫getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE)去除,呼叫時機可以在onCreateView方法或onActivityCreated方法,

 @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);  // 去掉空白部分
        View inflate = inflater.inflate(R.layout.dialog_test, container
, false); return inflate; }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); // 需在super.onActivityCreated方法前呼叫
        super.onActivityCreated(savedInstanceState);
    }

效果如下:
這裡寫圖片描述
2.去除對話方塊頂部藍色線條


方式一:
通過1中呼叫getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE)可以實現去除。
方式二
如果沒有呼叫getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE)
方法,則在5.0以下系統還需呼叫如下方法去掉(在onStart方法呼叫):

          if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {  // 對於部分低於5.0系統的手機的對話方塊頂部出現藍色線條
                int dividerId = getResources().getIdentifier("android:id/titleDivider", null, null);
                if (dividerId != 0) {
                    View divider = getDialog().findViewById(dividerId);
                    divider.setBackgroundColor(Color.TRANSPARENT);
                }
            }

效果如下:
這裡寫圖片描述
此種方式還需要去title空白區域,可以呼叫如下方法(在onStart方法中):

getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

效果和1.去除對話方塊頂部有白色塊一樣。

3.去除對話方塊左右邊緣與螢幕邊緣間隙
4.設定背景透明
上述兩項可通過Window物件重新設定相應的屬性來實現。

 @Override
    public void onStart() {
        super.onStart();
        Dialog dialog = getDialog();
        Window dialogWindow = dialog.getWindow();
        if (dialogWindow != null) {
            dialogWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));  // 設定對話方塊背景透明,即隱藏title的空白區域
            WindowManager.LayoutParams attributes = dialogWindow.getAttributes();
            attributes.gravity = Gravity.BOTTOM; // 底部顯示
            attributes.width = WindowManager.LayoutParams.MATCH_PARENT; // 設定寬度為手機寬度(去除間隙)
            attributes.dimAmount = 0.0f; // 設定背景透明(0-1,0為完全透明,1為不透明)
            dialogWindow.setAttributes(attributes);

            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {  // 對於部分低於5.0系統的手機的對話方塊頂部出現藍色線條
                int dividerId = getResources().getIdentifier("android:id/titleDivider", null, null);
                if (dividerId != 0) {
                    View divider = dialog.findViewById(dividerId);
                    divider.setBackgroundColor(Color.TRANSPARENT);
                }
            }
        }
    }

效果如下:
這裡寫圖片描述

5.頂部新增陰影
1.通過自定義drawable實現陰影效果(dialog_with_shadow.xml)

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item >
        <shape android:shape="rectangle" >
            <gradient
                android:angle="90"
                android:endColor="#00000000"
                android:startColor="#AF000000" />
        </shape>
    </item>

 <!--需要設定陰影長度-->
    <item android:top="10dp">
        <shape android:shape="rectangle" >
            <solid android:color="#FFFFFFFF"/>
        </shape>
    </item>

</layer-list> 

2.佈局引用上面自定的drawable

<?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="wrap_content">

    <!--需要多加個對話方塊巢狀層,並且需要屬性android:paddingTop="10dp"設定陰影長度-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"  // 設定陰影長度,實際程式碼要去掉此註釋
        android:background="@drawable/dialog_with_shadow"  // 引用陰影drawable檔案,實際程式碼要去掉此註釋
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv_dialog_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorWhite"
            android:gravity="left|center"
            android:paddingBottom="10dp"
            android:paddingLeft="16dp"
            android:paddingTop="10dp"
            android:text="Title"
            android:textColor="@color/colorBlack"
            android:textSize="@dimen/text_medium" />

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/colorGray" />

        <TextView
            android:id="@+id/tv_dialog_message"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorWhite"
            android:gravity="left|center_vertical"
            android:paddingBottom="25dp"
            android:paddingLeft="16dp"
            android:paddingTop="25dp"
            android:text="This is a dialog"
            android:textColor="@color/colorBlack"
            android:textSize="@dimen/text_medium" />

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/colorGray" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/tv_ok"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@color/colorWhite"
                android:gravity="center"
                android:padding="10dp"
                android:text="OK"
                android:textColor="@color/colorBlack"
                android:textSize="@dimen/text_medium" />

            <View
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:background="@color/colorGray" />

            <TextView
                android:id="@+id/tv_cancel"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@color/colorWhite"
                android:gravity="center"
                android:padding="10dp"
                android:text="NO"
                android:textColor="@color/colorGray"
                android:textSize="@dimen/text_medium" />

        </LinearLayout>

    </LinearLayout>

</LinearLayout>

備註:上述佈局缺失的資源
color:

    <color name="colorBlack">#000000</color> <!--黑色-->
    <color name="colorWhite">#FFFFFF</color> <!--白色-->
    <color name="colorGray">#DBDBDB</color> <!--灰色-->

dimen:

    <dimen name="text_medium">18sp</dimen>

相關推薦

Android 繼承DialogFragment實現對話方塊

前言 在重構專案UI時,由於需要重新改下對話方塊介面,然後期望效果圖如下: 雖然簡單,但是感覺很久都沒動手寫UI,差不多都忘了[尷尬],所以搞起來也是稍微耗了點時間,於是打算記錄下。 問題 繼承DialogFragment後,如果什麼都不處理,則效果

Android之AlerDialog實現對話方塊

AlerDialog在一個子類可以顯示一個對話方塊,兩個或三個按鈕。如果你只是想顯示一個字串在這個對話方塊中,使用setMessage()方法。如果你想顯示一個更復雜的檢視,查詢FrameLayout叫做“定製”並新增你的檢視:     對AlerDialog是現實了

Android 完全自定義對話方塊實現(標題欄+EditText+雙按鈕)

糾結了我一下午,為了能使用我比較鐘意的自定義對話方塊,我可謂絞盡腦汁,這裡寫下來 以表忠心。 這是我開始從網上看到的別人寫的自定義框。博文地址在這:點選 我的目的不僅僅是提示框,我想將其改成可以在中間輸入資料,然後按下確定我還可以獲取其中的資料來用的對話方塊。 然後

android開發 -- 對話方塊 Dialog 和 DialogFragment 詳解( Android 官方推薦 DialogFragment 建立對話方塊

 Android 官方推薦使用 : DialogFragment 建立對話方塊 ,不推薦直接使用Dialog建立對話方塊,所以能用寫對話方塊儘量用DialogFragment。自定義對話方塊也方便很多 推薦一篇DialogFragment的文章:http://blog.csdn.n

Android 官方推薦 : DialogFragment 建立對話方塊

1、 概述 DialogFragment在android 3.0時被引入。是一種特殊的Fragment,用於在Activity的內容之上展示一個模態的對話方塊。典型的用於:展示警告框,輸入框,確認框等等。 在DialogFragment產生之前,我們建立對話方

Android AlertDialog ————多選對話方塊

//彈出一個多選對話方塊 private void showMutilDialog() { //[1]構造對話方塊的例項 AlertDialog.Builder builder = new Builder(this); builder.setT

Android AlertDialog ————單選對話方塊

//彈出一個單選對話方塊 private void showSingleDialog() { //[1]構造對話方塊的例項 AlertDialog.Builder builder = new Builder(this); builder.se

Android studio Dialog 提示對話方塊

(1)在Android學習過程中,使用者介面設計模組的Dialog是基礎且比較重要的一部分。其中以提示對話方塊AlertDialog為例,它的用途很多,不少應用在退出程式時會呈現給使用者一個提示框,讓使用者決定是否退出程式。 (2)開啟Android studio,建立一個

Android-彈窗AlterDialog對話方塊使用全解析

主要方法: setMessage() 設定對話方塊內容為簡單文字 setItems() 對話款內容為簡單列表項 setSingleChoiceItems() 對話方塊內容為單選列表項

Android開發(AlertDialog對話方塊自定義佈局和多選列表不共存的替代辦法)

這個實現功能花了一點時間,當時忙了很晚,只怪當時沒有想出其他解決辦法。言歸正傳。 前幾天有這麼一個小夥伴,在開發有這樣的地圖app,該地圖app有多個地圖圖層,這些地圖圖層可提供給使用者操作,比如說圖層的顯示控制,以及選擇需要的圖層供查詢。由於該地圖app在主介面已經佈局很

Android中的多種對話方塊樣式詳解

轉載於:http://bbs.itheima.com/thread-219659-1-1.html 在Android應用開發中,程式與使用者互動的方式會直接影響到使用者的使用體驗,一直是產品經理們最為注重的部分,而對話方塊又是與使用者互動必不可少的部分。我們經常會需要

Android】AlertDialog PopupWindow對話方塊

Android最常見的對話方塊是 AlertDialog彈窗以及PopupWindow浮動對話方塊 一 . AlertDialog對話方塊 -> 帶訊息、帶按鈕的提示對話方塊 -> 帶列表、帶按鈕的列表對話方塊 -> 帶多個單選列表項、N個按鈕的對話方塊

VC 隱藏工作列,實現對話方塊的全屏顯示

這裡我選用實現對話方塊的全屏的方案是: 1 隱藏工作列 2 將對話方塊最大化顯示並且去掉標題欄 一  單獨隱藏工作列,很容易實現 缺陷:隱藏後任務欄所佔據的空間還是沒有騰出來 程式碼如下:HWND hWnd;hWnd = FindWindow("Shell_TrayWnd"

Android自定義Dialog對話方塊的幾種方法(精簡版)

自定義對話方塊是經常使用的功能,我們常用的彈窗操作,除了使用popwindow就是使用dialog來實現,這兩種元件都支援之定義佈局和功能來滿足我們個性化的需求,也可以不採用自定義而直接使用系統封裝好的api來實現功能。今天簡單總結下在使用dialog做彈窗功能

Android打造萬能的對話方塊Dialog(二)

打造萬能的對話方塊Dialog(二) 不要問我為什麼就這麼點破東西分兩篇來寫,但是我會告訴你還有第三篇的,哈哈哈: 就是一個簡單封裝,同上篇,但是你會發現太好用了,媽媽再也不用擔心我以後的對話方塊了 首先回顧一下上篇 不說話,先貼圖

Android彈出圓角對話方塊

Android系統提供的對話方塊,預設是方的,很不美觀,一般我們都是自定義圓角對話方塊。下面看一下圓角對話方塊的簡單試用。 先上效果圖: 很簡單,就是activity上一個按鈕,點選按鈕彈出圓角對話方塊。 下面看程式碼: 最最重要的s

Android打造萬能的對話方塊Dialog(一)

打造萬能的Dialog(一) 首先宣告一下,封裝框架,我習慣性的把佈局和程式碼分離開來,因為我個人覺得這樣的耦合性可以降到最低,但是可能會造成重複寫佈局的問題 就是一個簡單的實現 首先我們從最基本的入手 先上圖,看圖說話

android有時候需要show對話方塊,但是對話方塊需要依附於activity,如果沒有activity怎麼辦

     兩種方案: 1、彈出activity型別的對話方塊: 2、如果嫌第一種麻煩,那就getwindow(),讓你的對話方塊顯示在你取的window上; 第一種已經寫過了 第二種: 先在manifest理新增許可權     <uses-permission a

Android自定義AlertDialog對話方塊並回傳Activity引數

需求 開發過程總會想要自己設計的對話方塊,有時候還需要在activity獲取對話方塊的一些操作結果。 思路 1.自定義對話方塊,並繼承AlertDialog 2.在自定義對話方塊中,定義一個介面,並宣告一個方法,將操作結果作為方法引數 3.在act

Android繼承AppCompatActivity實現全屏設定

Android studio建立新專案後Activity預設繼承的是AppCompatActivity。 在使用自己建立的style的時候,如果沒有設定parent="xxx",其中xxx是appcompat相關的屬性,那麼在執行的時候就會報錯。所以要在使用的style裡面