文档章节

使用DialogFragment

yolinfeng
 yolinfeng
发布于 2015/06/06 17:50
字数 900
阅读 17
收藏 0

DialogFragment是Android3.0后引入的Fragment框架中的对传统Dialog效果用Fragment做的实现。android-support-v4兼容包中也包含了该类,所以我们可以通过导入兼容包在3.0之前的平台上使用它。Android开发文档上已经不推荐传统的Dialog使用了,而是用DialogFragment来代替。

下面开始照着Android的开发文档来说说DialogFragment的使用。

首先,要创建的Dialogfragment的布局文件fragment_edit_name:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/edit_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="vertical" > <TextView android:id="@+id/lbl_your_name" android:text="Your name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:id="@+id/txt_your_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType=”text” android:imeOptions="actionDone" /> </LinearLayout>
很简单的一个布局文件,标签+输入框,输入框inputType设置成text,imeOptions="actionDone"会将弹出的键盘上的enter按钮显示为完成(或Done)。


继承DialogFragment,创建EditNameDialog:

import android.support.v4.app.DialogFragment; // ... public class EditNameDialog extends DialogFragment { private EditText mEditText; public EditNameDialog() { // Empty constructor required for DialogFragment } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_edit_name, container); mEditText = (EditText) view.findViewById(R.id.txt_your_name); getDialog().setTitle("Hello"); return view; } }
代码理解应该没什么问题,跟自定义Fragment的方法一样,实现onCreateView方法设置要显示的视图。


在Activity中显示EditNameDialog:

import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; // ... public class FragmentDialogDemo extends FragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); showEditDialog(); } private void showEditDialog() { FragmentManager fm = getSupportFragmentManager(); EditNameDialog editNameDialog = new EditNameDialog(); editNameDialog.show(fm, "fragment_edit_name"); } }

showEditDialog方法就是展示Dialog,DialogFragment的显示方法和平常我们写的展示Fragment还有点不一样,一般自定义Fragment,用FragmentManager.beginTransaction得到一个Transaction,然后调用相应Transaction中做显示操作的方法(show,replace,attach、add),然后Transaction.commit(),展示Fragment。而上面的EditNameDialog则是用从DialogFragment继承下来的show方法,参数传入FragmentManager和Tag,这样来展示的。这里要注意一下。另外,默认情况下,回退键用来取消该dialog。

让EditNameDialog与Activity通信,先看代码:

import android.support.v4.app.DialogFragment;
// ...
public class EditNameDialog extends DialogFragment implements OnEditorActionListener {

    public interface EditNameDialogListener {
        void onFinishEditDialog(String inputText);
    }

    private EditText mEditText;

    public EditNameDialog() {
        // Empty constructor required for DialogFragment
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_edit_name, container);
        mEditText = (EditText) view.findViewById(R.id.txt_your_name);
        getDialog().setTitle("Hello");

        mEditText.requestFocus();                       // EditText获得焦点
        getDialog().getWindow().setSoftInputMode(
                LayoutParams.SOFT_INPUT_STATE_VISIBLE); // 显示软键盘
        mEditText.setOnEditorActionListener(this);      // 设置Action监听器

        return view;
    }

    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (EditorInfo.IME_ACTION_DONE == actionId) {
            // Return input text to activity
            EditNameDialogListener activity = (EditNameDialogListener) getActivity();
            activity.onFinishEditDialog(mEditText.getText().toString());
            this.dismiss();
            return true;
        }
        return false;
    }
}

记得在定义EditNameDialog的布局的时候,给EditText设置了弹出键盘的enter显示为Done,代码中EditNameDialog实现OnEditorActionListener,设置给EdiText,这个接口就是用来监听EditText的imeOptions所指定的动作事件的。实现接口方法onEditorAction,判断actionId若为EditorInfo.IME_ACTION_DONE,则取得所在Activity实现的EditNameDIalogListener接口,调用接口的onFinishEditDialog方法,将输入筐的内容传回给Activity做处理,最后取消Dialog。

EditNameDIalogListener接口在EditNameDialog中定义,展示EditNameDialog的Activity需要实现它这个接口,从而接收EditNameDialog传回的数据,实现通信。


注意一下RequestFocus的用法,这里是在代码里调用,也可以在xml文件中,给EditText加上<requestFocus/>,效果是一样的。然而,有些时候最好还是在代码中调用。例如,若在xml中设置了<requestFocus/>,当在Fragment的onCreateView方法给View添加了onFocusChangeListener监听器,那么接口的实现方法不会被调用。


最后补上实现了EditNameDialogListener的Activity代码:

import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
// ...

public class FragmentDialogDemo extends FragmentActivity implements EditNameDialogListener {

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

    private void showEditDialog() {
        FragmentManager fm = getSupportFragmentManager();
        EditNameDialog editNameDialog = new EditNameDialog();
        editNameDialog.show(fm, "fragment_edit_name");
    }

    @Override
    public void onFinishEditDialog(String inputText) {
        Toast.makeText(this, "Hi, " + inputText, Toast.LENGTH_SHORT).show();
    }
}

更多关于DialogFragment的使用方法请参考官方的Android文档…

本文转载自:http://blog.csdn.net/piglovesula/article/details/10460161

yolinfeng
粉丝 12
博文 196
码字总数 11946
作品 0
珠海
架构师
私信 提问
DialogFragment(二)——创建默认dialogFragment

前言 上篇我们对dialogFragment做了一个简单的介绍, DialogFragment(一)——简介 这篇文章,我们来讲讲默认dialogFragment的创建和使用 讲解重点 AppCompatActivity 和 DialogFragment 去掉...

奔跑的佩恩
2017/12/13
0
0
DialogFragment(一)——简介

前言 以前经常用dialog作为弹出框,但是google推荐我们使用新的dialog模式,即DialogFragment,今天就来讲讲dialogFragment相关知识点 本文涉及知识点: dialogFragment 相对 dialog 的优势 ...

奔跑的佩恩
2017/12/13
0
0
Android官方推荐使用DialogFragment替换AlertDialog

DialogFragment是在Android3.0(API level 11)中引入的,它代替了已经不建议使用的AlertDialog。 DialogFragment高效地封装和管理对话框的生命周期,并让Fragment和它包含的对话框的状态保持...

u010687392
2015/05/25
0
0
更好用的DialogFragment

工作中总是要用到各式各样的对话框,通常我们首先会想到的就是Dialog。在以前的时候我通常都会自定义一个Dialog,然后在里面写一个接口,让需要创建这个Dialog的界面继承这个接口,实现点击事...

一本未写完的书
2017/11/23
0
0
Android 撸起袖子,自己封装 DialogFragment

前言 具体的代码以及示例我都放上 Github 了,有需要的朋友可以去看一下 DialogFragmentDemos,欢迎 star 和 fork. 本文的主要内容 DialogFragment 是什么 创建通用的 CommonDialogFragment...

developerHaoz
2017/09/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库表与表之间的一对一、一对多、多对多关系

表1 foreign key 表2 多对一:表 1 的多条记录对应表 2 的一条记录 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以对应表2的一条记录 表2的多条记...

Garphy
38分钟前
6
0
MySQL 表崩溃修复

MySQL日志报错 2019-10-19 13:41:51 19916 [ERROR] /usr/local/mysql/bin/mysqld: Table './initread_hss/user_info' is marked as crashed and should be repaired2019-10-19 13:41:51 1......

雁南飞丶
48分钟前
6
0
Error和Exception

1.Error类和Exception类都是继承Throwable类 2.Error(错误)是系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。一般是指与虚拟机相关的问...

大瑞清_liurq
今天
4
0
8086汇编基础 start 程序入口标签的示例

    IDE : Masm for Windows 集成实验环境 2015     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   ......

志成就
今天
4
0
uni app 零基础小白到项目实战2

<template> <scroll-view v-for="(card, index) in list" :key="index"> <view v-for =(item, itemIndex) in card"> {{item.value}}</view> </scroll-view></template> GraceUi va......

达达前端小酒馆
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部