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裡面