Android開發畫布銷毀,Android DialogFragment 在頁面銷毀下的使用方式

今天看到了一篇文章,講了DialogFragment的封裝方式(Android:我為何要封裝DialogFragment?),想到當初也為頁面銷毀后DialogFragment的回調方式頭疼了好久,看到了po主的思路,與當初自己想的不太一樣,就整理一下.

如何在開發中遇到頁面銷毀的情況

在android開發中,頁面銷毀是個必須要考慮的一個問題.由于現在android手機性能越來越強,及自己在開發中其實是很難碰到頁面銷毀的情況,可以在手機設置-開發者選項中-不保留活動選項選中.這樣在app使用中,按下home鍵后,再回到app中,頁面就會重新onCreate.(由于我在開發中使用genimotion模擬器,某些情況下按下home鍵,再立即回到app中是不會銷毀的,可以在按下home鍵后,再開個別的app后,再回到自己的app中)

思想

一般設計的方式,是將回調的listener傳遞到DialogFragment的實例中,頁面銷毀后實例中保存的listener對象就會丟失.由于listener通常指向的是宿主本身,所以也無法通過onSaveInstance()方法保存,那么主動去獲取呢?

實現思路

在DialogFragment的實例中現將接該dialog中需要的接口定義好

宿主(activity或fragment)實現該接口

DialogFragment的實例中通過getActivity獲取activity對象,或者通過getTargetFragment獲取fragment對象,由于宿主本身實現了需要的回調接口,可以通過強轉直接調用接口中定義的方法

創建BaseDialogFragment

public class BaseDialogFragment extends DialogFragment {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// ...根據自己的需求

}

/**

* 為獲取接口類型定義的一個輔助方法 簡化每次都要強轉的麻煩

* @param listenerInterface

* @param

* @return

*/

protected T getDialogListener(Class listenerInterface) {

//用targetFragment是否為空來標識是fragment還是activity開啟的這個DialogFragment

final Fragment targetFragment = getTargetFragment();

if (targetFragment != null && listenerInterface.isAssignableFrom(targetFragment.getClass())) {

return (T) targetFragment;

}

if (getActivity() != null && listenerInterface.isAssignableFrom(getActivity().getClass())) {

return ((T) getActivity());

}

return null;

}

}

一個簡單的DialogFragment實現

public class ConfirmDialogFragment extends BaseDialogFragment {

/**

* 定義該dialog需要的回調方法

*/

public interface IConfirmDialogListener{

void onConfirmDialogPositiveListener();

void onConfirmDialogCancelListener();

}

private IConfirmDialogListener getConfirmDialogListener(){

return getDialogListener(IConfirmDialogListener.class);

}

@NonNull

@Override

public Dialog onCreateDialog(Bundle savedInstanceState) {

//程序簡單起見 直接使用該方法創建一個dialog

AlertDialog.Builder b = new AlertDialog.Builder(getActivity())

.setTitle("title")

.setMessage("msg")

.setPositiveButton("確認", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

getConfirmDialogListener().onConfirmDialogPositiveListener();

}

})

.setNegativeButton("取消", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

getConfirmDialogListener().onConfirmDialogCancelListener();

}

});

return b.create();

}

}

在activity中使用dialog

public class MainActivity extends AppCompatActivity implements ConfirmDialogFragment.IConfirmDialogListener {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ConfirmDialogFragment dialogFragment = new ConfirmDialogFragment();

dialogFragment.show(getSupportFragmentManager(),"tag");

}

@Override

public void onConfirmDialogPositiveListener() {

//確認事件

}

@Override

public void onConfirmDialogCancelListener() {

//取消事件

}

}```

#### 在fragment中使用

public class FeatureFragment extends Fragment implements ConfirmDialogFragment.IConfirmDialogListener{

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

showDialog();

//演示用 這里就不去創建布局了

return super.onCreateView(inflater, container, savedInstanceState);

}

private void showDialog() {

ConfirmDialogFragment dialogFragment = new ConfirmDialogFragment();

//設置target用于在dialogFragment中區分context是activity還是fragment 第二個參數為 requestCode 方便書寫這里為0

dialogFragment.setTargetFragment(this,0);

dialogFragment.show(getChildFragmentManager(),"tag");

}

@Override

public void onConfirmDialogPositiveListener() {

//確認事件

}

@Override

public void onConfirmDialogCancelListener() {

//取消事件

}

}

#### 缺點

- 宿主需要先實現接口,不能通過匿名內部類的方式傳遞

- 如果一個activity需要彈出多個對話框,宿主本身會override很多方法

#### 未實現功能

- 一個activity多次彈出dialog,每次按鈕有不同的功能,需要加入回調參數來區分 (待更新)

待更新

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395438.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395438.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395438.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

視覺智能產品發布 阿里云這項世界第一的技術現在人人可用

用手機拍下朋友的相片,軟件會自動識別進行分類并將照片發送給朋友。這不是空想,利用視覺智能對手機相冊進行管理、分類和分享正逐步成為現實。在6月10日舉行的云棲大會上海峰會上,阿里云正式發布了“圖像識別”和“人臉識別”兩款視覺智能服務…

ViewPager中Fragment的重復創建、復用問題

在ViewPager中的Fragment的生命周期 隨著頁面的切換 當前的展示頁相鄰的頁面生命周期一直在變化 一開始 剛進入Activity時候,ViewPager默認初始化好前兩個Fragment(消息和任務) 消息 ->任務 05-09 14:47:39.593 31509-31509/tyh.com.tabl…

使用VB.net建立excel文件

Add the following code snippet on top of Form1.vb Imports Excel Microsoft.Office.Interop.Excel Public Class Form1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim appXL As Excel.Application 聲明一個application對象Dim wbX…

沙盤演練工作坊-產品開發_Google認證的Android助理開發人員:考試演練

沙盤演練工作坊-產品開發by Rohan Taneja由Rohan Taneja Google認證的Android助理開發人員:考試演練 (Google Certified Associate Android Developer: Exam Walkthrough) UPDATE (24th July, 2018)更新(2018年7月24日) The certification exam is available agai…

linux hlist,linux內核V2.6.11學習筆記(2)--list和hlist

這兩個數據結構在內核中隨處可見,不得不拿出來單獨講講.這兩個數據結構都是為了方便內核開發者在使用到類似數據結構的時候不必自行開發(雖然不難),因此它們需要做到足夠的"通用性",也就是說,今天可以用它們做一個存放進程的鏈表,明天同樣可以做一個封裝定時器的鏈表…

14-angular.isDefined

判斷括號內的值是否存在。 格式: angular.isDefined(value); value: 被判斷是否存在的值。 返回值: true/false轉載于:https://www.cnblogs.com/ms-grf/p/6978886.html

實施工程師1分鐘即時演講_我是如何在1年內從時裝模特轉變為軟件工程師的

實施工程師1分鐘即時演講In 2015 I knew almost nothing about coding. Today, I’m a software engineer and a teacher at a code school for kids.在2015年,我對編碼幾乎一無所知。 今天,我是一名軟件工程師,還是一所代碼學校的兒童老師。…

MSSQL分組取后每一組的最新一條記錄

數據庫中二張表,用戶表和獎金記錄表,獎金記錄表中一個用戶有多條信息,有一個生效時間,現在要查詢: 獎金生效時間在三天前,每個用戶取最新一條獎金記錄,且用戶末鎖定 以前用的方法是直接寫在C#代…

android模擬器插件,Android模擬器插件找不到android SDK

首先,克隆項目詹金斯一直輸出后:[android] No Android SDK found; lets install it automatically...[android] Going to install required Android SDK components...[android] Installing the platform-tool,tool SDK component(s)...$ /var/lib/jenki…

讀書筆記--模板與泛型編程

了解隱式接口和編譯期多態 編譯期多態和運行期多態 運行期多態就好比是virtual函數再運行的時候才確定該virtual函數該被綁定為哪個函數,運行的時候才確定函數類型。  編譯期多態就好比是泛型編程和模板編程中,在編譯的時候才確定哪個函數該被調用&…

棧和遞歸的關系 144:Binary Tree Preorder Traversal

前序遍歷:根左右 //用棧來實現非遞歸解法/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:vec…

運行級別

ls -l /usr/lib/system/runlevel*target (查看運行級別)Linux系統有7個運行級別(runlevel)運行級別0:系統停機狀態,系統默認運行級別不能設為0,否則不能正常啟動運行級別1:單用戶工作狀態,roo…

微信sdk swift版_使用Swift 4的iOS版Google Maps SDK終極指南

微信sdk swift版by Dejan Atanasov通過Dejan Atanasov 使用Swift 4的iOS版Google Maps SDK終極指南 (Your ultimate guide to the Google Maps SDK on iOS, using Swift 4) Many iOS apps use Google Maps. This is a very common feature, so I have decided to prepare an u…

精確覆蓋DLX算法模板

代碼 struct DLX {int n,id;int L[maxn],R[maxn],U[maxn],D[maxn];int C[maxn],S[maxn],loc[maxn][2];void init(int nn0) //傳列長{nnn;for(int i0;i<n;i) U[i]D[i]i,L[i]i-1,R[i]i1;L[0]n; R[n]0;idn;memset(S,0,sizeof(S));}void AddRow(int x,int col,int A[]) //傳入參…

android 代碼布局設置wrap_content,android ScrollView布局(wrap_content,最大大小)

我最后編寫了自己的類,擴展了ScrollView既然你問……這是代碼.可能不是最干凈但它做我想要的.請注意,它期望在創建視圖時設置layout_weight,并且不應在父LinearLayout中設置weigthSum,否則你會得到有趣的東西(因為這個的權重從原始值變為0,具體取決于大小ScrollView的內容)首先…

ABAP數據類型

數據類型表&#xff1a; 類型縮寫 類型 默認長度 允許長度 初始值 描述 C 文本型 1 Space 字符串數據,如Program D 日期型 8 8 00000000 日期數據,格式為YYYYMMDD F 浮點型 8 8 0 浮點數 I 整型 4 10 0 帶正負符號的整數 N 數值型 1 31 00……

cocos2d-x C++ 原始工程引擎運行機制解析

新建一個工程&#xff0c;相信感興趣的同學都想知道cocos引擎都是如何運行的 想知道是如何運行的&#xff0c;看懂四個文件即可 話不多說&#xff0c;上代碼&#xff1a; 1、首先解釋 AppDelegate.h 1 #ifndef _APP_DELEGATE_H_2 #define _APP_DELEGATE_H_3 4 #include "…

web高德maker動畫_Web Maker —我如何構建一個快速的離線前端游樂場

web高德maker動畫by kushagra gour由kushagra gour Web Maker —我如何構建一個快速的離線前端游樂場 (Web Maker — How I built a fast, offline front-end playground) Web Maker is a Chrome extension that gives you a blazing fast and offline front-end playground —…

時間小知識對于時間轉換可能有幫助

那么UTC與世界各地的時間應如何換算呢?它是將全世界分為24個時區&#xff0c;地球的東、西經各180(共360)被24個時區平分&#xff0c;每個時區各占15。以經度0(即本初子午線)為基準&#xff0c;東經730′與西經730′之間的區域為零時區&#xff1b;東經和西經的730′與2230′之…

JS——實現短信驗證碼的倒計時功能(沒有驗證碼,只有倒計時)

1、功能描述 當用戶想要獲取驗證碼時&#xff0c;就點擊 免費獲取驗證碼 &#xff0c;然后開始倒計時&#xff0c;倒計時期間按鈕文字為剩余時間x秒&#xff0c;且不可按狀態&#xff0c;倒計時結束后&#xff0c;按鈕更改為點擊重新發送。 2、分析 必須用到定時器。按鈕點擊后…