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.mzph.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、分析 必须用到定时器。按钮点击后…