android DialogFragment简单使用

android DialogFragment简单使用

  • 历史:
    android 3.0时被引入。
    DialogFragment产生之前,我们创建对话框:一般采用AlertDialog和Dialog官方不推荐直接使用Dialog创建对话框
  • 用法:
  • DialogFragment至少需要实现onCreateView或者onCreateDIalog方法
    • 方式一:重写onCreateView(),跟fragment一样。不过实例化,跟fragment之间传递不同。
        public void showEditDialog(View view){
            EditNameDialogFragment editNameDialog = new EditNameDialogFragment();
            editNameDialog.show(getFragmentManager(), "EditNameDialog");
        }
      
    • 方式二:重写onCreateDialog. 一般可以使用AlertDialog或者Dialog创建对话框。首先脑补下AlertDialog的用法,AlertDialog的构造方法都是Protected,所以不能直接通过不能直接通过new一个AlertDialog来创建出一个AlertDialog。要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法。接着,必须了解AlertDialog.Builder的几个用法。(关于AlertDialog的详解,查看Android AlertDialog 详解 )
        setTitle :为对话框设置标题
        setIcon :为对话框设置图标
        setMessage:为对话框设置内容
        setView : 给对话框设置自定义样式
        setItems :设置对话框要显示的一个list,一般用于显示几个命令时
        setMultiChoiceItems :用来设置对话框显示一系列的复选框
        setNeutralButton    :普通按钮
        setPositiveButton   :给对话框添加"Yes"按钮
        setNegativeButton :对话框添加"No"按钮
        create : 创建对话框
        show :显示对话框
      
      接下来是正式的重写代码:
        public Dialog onCreateDialog(Bundle savedInstanceState)  {  
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());  
        // Get the layout inflater  
        LayoutInflater inflater = getActivity().getLayoutInflater();  
        View view = inflater.inflate(R.layout.fragment_login_dialog, null);  
        // Inflate and set the layout for the dialog  
        // Pass null as the parent view because its going in the dialog layout  
        builder.setView(view)  
                // Add action buttons  
                .setPositiveButton("Sign in",  
                        new DialogInterface.OnClickListener()  
                        {  
                            @Override  
                            public void onClick(DialogInterface dialog, int id)  
                            {  
                            }  
                        }).setNegativeButton("Cancel", null);  
        return builder.create();  
        }  
      
  • 数据传递,与Activity的通信-->这个才是重点。使用“fragment interface pattern”的方式,对这个方式的解释,只找到了官方文档:Communicating with Other Fragments,涉及到了“设计模式”的应用。
    最重要的代码:LoginInputListener listener = (LoginInputListener) getActivity();

    • 首先在其内部声明一个接口

      public class LoginDialogFragment extends DialogFragment {
      public interface LoginInputListener {
      void onLoginInputComplete(String username, String password);
      }
      }

    • 然后在相应的方法是执行这一段:

      LoginInputListener listener = (LoginInputListener) getActivity();
      listener.onLoginInputComplete(mUsername.getText().toString(), mPassword .getText().toString());

    • 最后在MainActivity中需要实现我们的接口LoginInputListener实现我们的方法

      public class MainActivity extends Activity implements LoginInputListener {
      @Override
      public void onLoginInputComplete(String username, String password) {
      Toast.makeText(this, "帐号:" + username + ", 密码 :" + password,

            Toast.LENGTH_SHORT).show();  
      

      }
      }
      参考资料:
      Android 官方推荐 : DialogFragment 创建对话框
      从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-6.对话框)

  • 注意:这种只能在fragment与Activity之间的数据传递,而且Activity必须实现相应的接口,这里为(LoginInputListener),否则会抛出ClassCastException can not...意思是不能执行相应的转化。我试想在fragment上实现接口,结果就失败了。因为这句LoginInputListener listener = (LoginInputListener) getActivity();是得到Activity的共享数据,所以一定要指定Activity去实现接口。
  • 那么问题就来了,如何实现fragment之间的通信呢?
    其实也很简单,只要在实例化的时候,通过函数,传递相应的共享数据给DialogFragment就行了。

    • 首先在LoginDialogFragment中增加一个初始化函数和成员
        private onEdTextListener edTextListener=null;
        public void initDialog(onEdTextListener listener) {
            edTextListener = listener;
        }
      
    • 接着在实例化LoginDialogFragment的时候,并执行初始化函数。

        public void showEditDialog() {
            EditNewThingDialog editThingDialog = new EditNewThingDialog();
            editThingDialog.initDialog(CloudTagsFragment.this);//这句很重要,进行初始化listener监听器
            editThingDialog.show(getFragmentManager(), "EditNameDialog");
        }
      

      此时,edTextListener就可以用了,可以在相应的地方,用他的方法,进行传递数据。例如:

        @Override
        public void onClick(DialogInterface arg0, int arg1) {
            if (edNewThing != null && edTextListener!=null) {
                edTextListener.updateNewThing(edNewThing.getText().toString());
            }
        }
      

      或许讲解的不够明白,贴下完整的代码:
      类:CloudTagsFragment

        package com.dacer.simplepomodoro;
        import java.util.ArrayList;
        import java.util.LinkedList;
        import java.util.List;
        import java.util.Queue;
        import com.dacer.simplepomodoro.EditNewThingDialog.onEdTextListener;
        import android.app.Activity;
        import android.os.Bundle;
        import android.os.Handler;
        import android.os.Message;
        import android.support.v4.app.Fragment;
        import android.util.Log;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.View.OnClickListener;
        import android.view.ViewGroup;
        import android.widget.ImageButton;
        import android.widget.TextView.OnEditorActionListener;
        import dacer.views.FlowLayout;
        /**
         * @author TryIT
         */
        public class CloudTagsFragment extends Fragment implements onEdTextListener {
            ImageButton imbtnAddCloudTag;
            Handler mHandler=new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    if(msg.what==1){
                        addCloudView();    //初始化标签云
                        Log.d("handler", "addCloudView");
                    }
                }
            };
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                mActivity=getActivity();
            }
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                View rootView=inflater.inflate(R.layout.fragment_cloud_tags, container,false);
                imbtnAddCloudTag=(ImageButton)rootView.findViewById(R.id.tagcloudcontent);
                imbtnAddCloudTag.setOnClickListener(new OnClickListener() {
      
                    @Override
                    public void onClick(View arg0) {
                        showEditDialog();
                    }
                });
                return rootView;
            }
            public void showEditDialog() {
                EditNewThingDialog editThingDialog = new EditNewThingDialog();
                editThingDialog.initDialog(CloudTagsFragment.this);
                editThingDialog.show(getFragmentManager(), "EditNameDialog");
            }
            @Override
            public void onDestroy() {
                layout.stop();
                super.onDestroy();
            }
            @Override
            public void updateNewThing(String newThing) {
                List<String> lists=queue.poll();
                lists.add(newThing);
                queue.add(lists);
                mHandler.sendEmptyMessage(1);    //更新UI
            }
        }
      

      类:EditNewThingFragment

        package com.dacer.simplepomodoro;
        import android.app.AlertDialog;
        import android.app.Dialog;
        import android.content.DialogInterface;
        import android.content.DialogInterface.OnClickListener;
        import android.os.Bundle;
        import android.support.v4.app.DialogFragment;
        import android.view.View;
        import android.widget.EditText;
        public class EditNewThingDialog extends DialogFragment {
            private EditText edNewThing;
            private onEdTextListener edTextListener=null;
            public void initDialog(onEdTextListener listener) {//这里接受传递的共享数据,很关键
                edTextListener = listener;
            }
            public interface onEdTextListener { //内部接口,进行传递数据。
                public void updateNewThing(String newThing);
            }
            @Override
            public Dialog onCreateDialog(Bundle savedInstanceState) {
                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                View dialogView = getActivity().getLayoutInflater().inflate(
                        R.layout.dialog_edit_task_fragment, null);
                edNewThing = (EditText) dialogView.findViewById(R.id.title);
                builder.setView(dialogView)
                        .setPositiveButton("确定", new OnClickListener() {
                            @Override
                            public void onClick(DialogInterface arg0, int arg1) {
                                if (edNewThing != null && edTextListener!=null) {
                                    edTextListener.updateNewThing(edNewThing.getText().toString());
                                }
                            }
                        }).setNegativeButton("取消", null);
                return builder.create();
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值