Fragment之8_____DialogFragment_daozhongyang的专栏-程序员宅基地

技术标签: Fragment  

在Android系统,   可以使用碎片事务FragmentTransaction  将对话框碎片DialogFragment 显示为碎片,

以下列出一段代码:

public void showDialog (){

      MyDialgFragment  dialogFragment =  MyDialgFragment.newInstance(arg1,  arg2);

      FragmentManager   manager    =   getFragmentManager();

      FragmentTransaction   transaction =  manager.beginTransaction();

      dialogFragment.show(transaction,   "my-dialog-tag");  

}

 显示对话框碎片(DialogFragment)的步骤如下:

1.  创建DialogFragment

2.  通过碎片管理器创建对话框事务 FragmentTransaction

3.   使用碎片事务对象显示对话框

自定义的对话框碎片创建时,需要改写以下两个方法之一, 以提供对话框的视图结构,

1  重写View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle b)方法, 返回一个视图View

2  重写 Dialog onCreateDialog(Bundle b)  方法,返回一个对话框Dialog

下面创建一个DialogFragment 示例程序, 来演示DialogFragment的概念.

包括: MainActivity ,PromptDialogFragment, AlertDialogFragment,  HelpDialogFragment 类, 一个接口 OnDialogDoneListener,

MainActivity 主要代码:

public class MainActivity extends Activity implements OnDialogDoneListener {
	
	public static final String   LOGTAG = "DialogFragmentDemo";
	public static String  ALERT_DIALOG_TAG = "ALERT_DIALOG_TAG";
	public static String  HELP_DIALOG_TAG = "HELP_DIALOG_TAG";
	public static String  PROMPT_DIALOG_TAG = "PROMPT_DIALOG_TAG";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        FragmentManager.enableDebugLogging(true);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) { 
    	super.onCreateOptionsMenu(menu);
 	   	MenuInflater inflater = getMenuInflater();
 	   	inflater.inflate(R.menu.menu, menu);
    	return true;
    }

    @Override
	public boolean onOptionsItemSelected(MenuItem item)  {
    	switch(item.getItemId()){
    	case R.id.menu_show_alert_dialog:
    		testAlertDialog();
    		return true;
    	case R.id.menu_show_prompt_dialog:
    		this.testPromptDialog();
    		return true;
    	case R.id.menu_help:
    		testHelpDialog();
    		return true;
    	}

    	return true;
    }

	private void testPromptDialog()   {
    	FragmentTransaction ft =  getFragmentManager().beginTransaction();
    	PromptDialogFragment pdf = 	PromptDialogFragment.newInstance("Enter Something");
    	pdf.show(ft, PROMPT_DIALOG_TAG);
    	
    	//FragmentOther  other = (FragmentOther)this.getFragmentManager()
    	//	.findFragmentByTag("other");
    	//other.
    	//CalledFragment m = new CalledFragment();
    }

    private void testAlertDialog() {
    	FragmentTransaction ft = getFragmentManager().beginTransaction();
    	AlertDialogFragment adf = AlertDialogFragment.newInstance("Alert Message");
    	adf.show(ft, ALERT_DIALOG_TAG);
    }

	private void testHelpDialog()  {
    	FragmentTransaction ft = getFragmentManager().beginTransaction();
    	HelpDialogFragment hdf = HelpDialogFragment.newInstance(R.string.help_text);
    	hdf.show(ft, HELP_DIALOG_TAG);
    }

	public void onDialogDone(String tag, boolean cancelled, CharSequence message) {
		String s = tag + " responds with: " + message;
		if(cancelled)
			s = tag + " 被取消";
		Toast.makeText(this, s, Toast.LENGTH_LONG).show();
	}
}

MainActivity实现了OnDialogDoneListener 接口, 显然重写了onDialogDone(), 这个方法提供了一个调用碎片的标记,表示是否取消了对话框碎片的布尔值, 以及一条消息。


OnDialogDoneListener 接口:

public interface OnDialogDoneListener {
  public void onDialogDone(String tag, boolean cancelled, CharSequence message);
}

再看 提醒对话框碎片 AlertDialogFragment类,  此碎片没有布局, 因为AlertBuilder 会提供布局

public class AlertDialogFragment extends DialogFragment
	implements DialogInterface.OnClickListener {
	
	public static AlertDialogFragment   newInstance(String message) {
		AlertDialogFragment adf = new AlertDialogFragment();
		Bundle bundle = new Bundle();
		bundle.putString("alert-message",message);
		adf.setArguments(bundle);
		return adf;
	}
	
    @Override    
    public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	this.setCancelable(true);
        int style = DialogFragment.STYLE_NORMAL, theme = 0;
        setStyle(style,theme);
    }


    @Override    
    public Dialog onCreateDialog(Bundle savedInstanceState) {        
    	AlertDialog.Builder b = 
    		new AlertDialog.Builder(getActivity());
    	b.setTitle("Alert!!");
    	b.setPositiveButton("Ok", this);
    	b.setNegativeButton("Cancel", this);
    	b.setMessage(this.getArguments().getString("alert-message"));
    	return b.create();
    }


    public void onClick(DialogInterface dialog, int which) {
    	OnDialogDoneListener act = (OnDialogDoneListener) getActivity();
        boolean cancelled = false;
    	if (which == AlertDialog.BUTTON_NEGATIVE){
    		cancelled = true;
    	}
    	act.onDialogDone(getTag(), cancelled, "Alert dismissed");
    }
}

注意: AlertDialogFragment 与 MainActivity 通过接口实现了从碎片到调用活动的通信. 

几点认识:

1.  对话框碎片的 show()  方法接受一个碎片事务作为输入。通过碎片事务来将此对话框添加到Activity中, 然后提交该 碎片事务。  但是, show() 方法没有将该事务添加到后退栈中。如果要这么做,需要先将此事务添加到后退栈,然后将它传递给show(),  

2.  show() 方法有以下多态形式:

int show(FragmentTransaction  ft,  String tag) :  通过将此碎片添加到具有指定标记的传入事务中来显示对话框。返回所提交事务的标识符 

int show(FragmentManager  manager,  String  tag):  此方法自动化从碎片管理器获取事务的过程。 这是一种快捷方式。  但是此方法无法向后退栈添加事务。  如果需要这么做,请使用第一种方法.


3.  对话框是一个Fragment,  由此所产生的一个优点是:  底层的碎片管理器会执行基本的状态管理。 例如: 即使设备进行了 横竖屏切换,对话框也会再现,而无需执行任何状态管理。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aduovip/article/details/41095875

智能推荐

python办公模块_python安装模块的操作内容讲解_高太爷的博客-程序员宅基地

python安装模块的操作内容讲解有些网友可能还不晓得python安装模块的操作,而下面dengb.com小编就讲解了python安装模块的操作方法,一起来学习吧。安装模块前,首先要安装setuptools。就能用ez_setup.py安装了setuptools了。有setuptools,就要开始配置环境。因为需要用到python安装目录下的Scripts文件夹里面的文件到桌面,点击计算机右键--...

python爬虫css选择器的使用_一千次晚安。的博客-程序员宅基地_python爬虫css选择器

python爬虫之css选择器的使用 - Tron ' blog转自个人博客在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素。w3school给出的css选择器手册.class demo: .intro 选择class为intro的标签id demo: #111 选择id为111的标签element demo: p 选择所有p标签element,element demo: p,a 选择所有的p标签以及a标签element element demo: div p 选择所有.

mapper mysql 主键_mybatis 通用mapper返回插入主键_张老三丶的博客-程序员宅基地

查看地址:http://git.oschina.net/free/Mapper/blob/master/wiki/mapper3/3.Use.md3.主键策略(仅用于insert方法)通用Mapper还提供了序列(支持Oracle)、UUID(任意数据库,字段长度32)、主键自增(类似Mysql,Hsqldb)三种方式,其中序列和UUID可以配置多个,主键自增只能配置一个。由于MySql自增主键最...

(转)winform之RichTextBox_weixin_30739595的博客-程序员宅基地

RichTextBox是一种可用于显示、输入和操作格式文本,除了可以实现TextBox的所有功能,还能提供富文本的显示功能。 控件除具有TextBox控件的所有功能外,还能设定文字颜色、字体和段落格式,支持字符串查找功能,支持rtf格式等功能。下面就其的常用到的功能进行介绍。一、显示滚动条RichTextBox可设置Multiline属性来控制是否显示滚动套,true为是,fal...

操作系统-进程概念_weixin_30840573的博客-程序员宅基地

一、定义(Process)  进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位1、进程是程序的一次执行过程,是对CPU的抽象,是正在运行的程序的抽象2、每个进程具有独立的地址空间3、操作系统通过调度将CPU的控制权交给某个进程二、进程控制块PCB(Process Control Block)  又称进程描述符,进程属性,是操作系统...

mysql 收入_mysql 收支统计问题_weixin_39707941的博客-程序员宅基地

#开支项目droptableifexistswl_spending_name;createtableifnotexistswl_spending_name(idint(10)unsignednotnullauto_incrementprimarykey,#IDnamevarchar(50)notnull,#名称typesmal...#开支项目drop table if exists wl_spen...

随便推点

ASP.NET javascript实现图片切换_马克菠萝包ଲ的博客-程序员宅基地_asp图片自动切换

①Default.aspx文件<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html

python中isinstance怎么用_python – 我如何正确使用isinstance()_百里临渊的博客-程序员宅基地

def convBin():cont = []rest = []dev = []decimal = []print("Give me a number: ")valor = input()if isinstance(valor, int):while valor > 0:z = valor // 2resto = x%2valor = valor // 2cont.append(z)rest...

分治递归逆序数_【分治】逆序对计算-Count Inversion_复位还的博客-程序员宅基地

逆序对定义如果存在正整数使得,而且,则这个有序对称为的一个逆序对,也称作逆序数。例题1 - LeetCode剑指 Offer 51. 数组中的逆序对题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。输入: [7,5,6,4]输出: 5限制:0 <= 数组长度 <= 50000思路逆序对:<7,5>...

得道读书会 php源码,读书会之感恩会的分享_我真真的博客-程序员宅基地

首先感谢大家给我这个机会,来跟大家学习交流。先分享一下我的学习收获:1.收获了新的、正确观念,如人生应有正确信仰、人生五大问题的认识、世界观的认识、财富观、环保观、生命的回归、佛教徒的人生观、导师的修学历程及对佛教界现状的认识及存在问题的思考,佛陀成道与佛法。对这些法义的学习,开阔了眼界,改变了观念,颠覆了认识。尤其佛教的三法印,有的称四法印,苦、空、无常、无我,更是我对宇宙人生重新认识,重新定位...

ASP.NET MVC 5 入门教程 (1) 新建项目_weixin_30790841的博客-程序员宅基地

ASP.NET MVC 5 入门教程 (1) 新建项目 原文:ASP.NET MVC 5 入门教程 (1) 新建项目文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-get-started-create-project.html下一节: ASP.NET MVC 5 入门教程 ...

python函数内的的类_python:类内的函数调用_青葭的博客-程序员宅基地

这是一个示例程序,在您按下按钮1或2时显示“Hello”或“Good bye”,这是从我的实际程序中简化的。我要做的是在程序启动时执行函数btn1()并显示“Hello”,而不按按钮1。我应该在哪里添加什么代码行?当我把“Greetings().btn1()”放在类问候语中时,出现错误:“name Greetings is not defined”。然后我在类GreetingApp中的def bu...

推荐文章

热门文章

相关标签