android中DialogFragment的一些使用笔记

对于弹出框,我经常使用的是Aialog和popwindow,虽然官方推荐使用的是DialogFramgent,也用过一些,但是做的项目中一直都是之前封装好的 Aialog和popwindow。这回做大版本改进,正好,我就将部分功能改成了DialogFragment。下面将其中的一个选择均线的功能记录下来。
我们做的是一个股票相关的APP,这里面有一个功能是,可以让用户自己选择要显示的均线个数与多少根均线,在点击均线的时候,要弹出一个框,让用户在其中进行选择。如下图,录的感觉有点卡,模拟器和真机上不会出现这种卡的效果。
![演示图](https://img-blog.csdn.net/20161220103832327?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbmd1YW5nNzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
DialogFragment就是一个Fragment,其中的最基本的应用,可以去看一下鸿洋的博客,我也是根据这个来学习的http://blog.csdn.net/lmj623565791/article/details/37815413
在我的功能中,要解决的问题有三个
    1,DialogFragment要是圆角背景。
    2, DialogFragment与Activity或是Fragment进行数据互换。
    3, checkbox变成圆形。
对于这个弹出框,简单分析一下他的功能,分以下四步来处理,我要解决的问题,也包括在这些步骤中:
第一,我们要传一些值给Dialog,传什么值,就是均线的值,我们这里是定死最多六根均线,用户可以选择几根,同时可以修改相应位置的均线值。每个位置上的均线颜色是固定的,为了画均线好画,我采用的是hash表的结构,它有key,value这样我可以根据key来取值。
    我们默认给出的是 5,10,20,60,120,250这样我们就用这些默认的值做为Key。
第二,怎么转给Dialog呢,一般情况下,我们都是通过构造函数传值给Fragment的,可是你用构造函数的时候,你会发现,他提示你这是不让的,他要求我们使用newInstance的方式进行传值。只要知道了怎么传就OK了。
第三,我们的设计人员,把checkbox设计成了圆形了,这个还好办,我们做两个圆形图片,做backgroup就应该OK了。
第四,将用户修改之后的数据再传回来,这个传给Activity,我们一般都是在Fragment中定义一个接口,然后传回。但是如果是Fragment呢,要使用什么呢。onActivityResult,这个就很强了。
好了,一共就这么四步,我们来一步一步的完成它。

第一步,本来打算用hash表的,可是google官方推荐使用的是SparseArray<>,使用也很方便,put存,get取。可是最恶心的是,在传值的时候,根本就没有这个类型可以值,这样就没有办法了,我又不想再建一个model用来传,只好定义一个ArrayList,里面按顺序存6个值。这样的话,就定义死arr[0]是5,[1]10,以此类推。
    ArrayList aMa = new ArrayList<>();

                aMa.add(maLine.get(5,5));
                aMa.add(maLine.get(10,10));
                aMa.add(maLine.get(20,20));
                aMa.add(maLine.get(60,60));
                aMa.add(maLine.get(120,0));
                aMa.add(maLine.get(250,0));

                fragDialg dialog = fragDialg.newInstance(aMa);
                //注意setTargetFragment
                dialog.setTargetFragment(oneFragment.this, 102);
                dialog.show(getFragmentManager(), "cg");
   第二步,知道了传什么值,下面我们开始编写我们的DialogFragment,这里先写和Activity进行互动数据的。
   这里要注意的是是我们要解决的第一个问题,就是圆角背景,在onCreateView另上两行代码就OK了,这个我在代码中标注了。代码如下:
package com.example.cg.dialogfragmentopra.dialog;


import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.example.cg.dialogfragmentopra.R;

import java.util.ArrayList;

/**
 * 弹出的DialogFragment,这里我要根据传入的值,来判断相关的复选框是否被选中。然后再根据用户的选择将选中的值返回给调用页
 * 作者:cg
 * 时间:2016/12/19 0019 上午 10:34
 */
public class myDialog extends DialogFragment {

    /**
     * 定义一个接口,与Activity进行传值
     */
    public interface MaLineListener
    {
        void MaLineOnListener(ArrayList maLine);
    }

    private ArrayList maLine;




    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        maLine = getArguments().getIntegerArrayList("maLine");
    }

    public static myDialog newInstance(ArrayList maLine) {
        myDialog f = new myDialog();

        // Supply num input as an argument.
        Bundle args = new Bundle();
        args.putIntegerArrayList("maLine",maLine);
        f.setArguments(args);

        return f;
    }

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


        View view = inflater.inflate(R.layout.fragment_mydialog, container, false);
        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

        /**
         * MA5
         */
        final RelativeLayout linear_maedit5 = (RelativeLayout)view.findViewById(R.id.linear_maedit5);
        final CheckBox chk_ma5 = (CheckBox)view.findViewById(R.id.chk_ma5);
        final TextView txt_dma5 = (TextView)view.findViewById(R.id.txt_dma5);
        final EditText edit_ma5 = (EditText)view.findViewById(R.id.edit_ma5);
        final ImageView img_ma5 = (ImageView)view.findViewById(R.id.img_ma5);
        if(maLine.get(0)!=0)
        {
            chk_ma5.setChecked(true);
            txt_dma5.setText("MA" + maLine.get(0));
            edit_ma5.setText(maLine.get(0).toString());
        }

        txt_dma5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                txt_dma5.setVisibility(View.GONE);
                linear_maedit5.setVisibility(View.VISIBLE);
                setEditTextBroad(edit_ma5);
            }
        });

        img_ma5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                linear_maedit5.setVisibility(View.GONE);
                txt_dma5.setVisibility(View.VISIBLE);
                txt_dma5.setText("MA" + edit_ma5.getText().toString());
            }
        });

        /**
         * MA10
         */
        final RelativeLayout linear_maedit10 = (RelativeLayout)view.findViewById(R.id.linear_maedit10);
        final CheckBox chk_ma10 = (CheckBox)view.findViewById(R.id.chk_ma10);
        final TextView txt_dma10 = (TextView)view.findViewById(R.id.txt_dma10);
        final EditText edit_ma10 = (EditText)view.findViewById(R.id.edit_ma10);
        final ImageView img_ma10 = (ImageView)view.findViewById(R.id.img_ma10);
        if(maLine.get(1)!=0)
        {
            chk_ma10.setChecked(true);
            txt_dma10.setText("MA" + maLine.get(1));
            edit_ma10.setText(maLine.get(1).toString());
        }

        txt_dma10.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                txt_dma10.setVisibility(View.GONE);
                linear_maedit10.setVisibility(View.VISIBLE);
                setEditTextBroad(edit_ma10);
            }
        });

        img_ma10.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                linear_maedit10.setVisibility(View.GONE);
                txt_dma10.setVisibility(View.VISIBLE);
                txt_dma10.setText("MA" + edit_ma10.getText().toString());
            }
        });

        /**
         * MA20
         */
        final RelativeLayout linear_maedit20 = (RelativeLayout)view.findViewById(R.id.linear_maedit20);
        final CheckBox chk_ma20 = (CheckBox)view.findViewById(R.id.chk_ma20);
        final TextView txt_dma20 = (TextView)view.findViewById(R.id.txt_dma20);
        final EditText edit_ma20 = (EditText)view.findViewById(R.id.edit_ma20);
        final ImageView img_ma20 = (ImageView)view.findViewById(R.id.img_ma20);
        if(maLine.get(2)!=0)
        {
            chk_ma20.setChecked(true);
            txt_dma20.setText("MA" + maLine.get(2));
            edit_ma20.setText(maLine.get(2).toString());
        }

        txt_dma20.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                txt_dma20.setVisibility(View.GONE);
                linear_maedit20.setVisibility(View.VISIBLE);
                setEditTextBroad(edit_ma20);
            }
        });

        img_ma20.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                linear_maedit20.setVisibility(View.GONE);
                txt_dma20.setVisibility(View.VISIBLE);
                txt_dma20.setText("MA" + edit_ma20.getText().toString());
            }
        });

        /**
         * MA60
         */
        final RelativeLayout linear_maedit60 = (RelativeLayout)view.findViewById(R.id.linear_maedit60);
        final CheckBox chk_ma60 = (CheckBox)view.findViewById(R.id.chk_ma60);
        final TextView txt_dma60 = (TextView)view.findViewById(R.id.txt_dma60);
        final EditText edit_ma60 = (EditText)view.findViewById(R.id.edit_ma60);
        final ImageView img_ma60 = (ImageView)view.findViewById(R.id.img_ma60);
        if(maLine.get(3)!=0)
        {
            chk_ma60.setChecked(true);
            txt_dma60.setText("MA" + maLine.get(3));
            edit_ma60.setText(maLine.get(3).toString());
        }
        txt_dma60.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                txt_dma60.setVisibility(View.GONE);
                linear_maedit60.setVisibility(View.VISIBLE);
                setEditTextBroad(edit_ma60);
            }
        });
        img_ma60.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                linear_maedit60.setVisibility(View.GONE);
                txt_dma60.setVisibility(View.VISIBLE);
                txt_dma60.setText("MA" + edit_ma20.getText().toString());
            }
        });

        /**
         * MA120
         */
        final RelativeLayout linear_maedit120 = (RelativeLayout)view.findViewById(R.id.linear_maedit120);
        final CheckBox chk_ma120 = (CheckBox)view.findViewById(R.id.chk_ma120);
        final TextView txt_dma120 = (TextView)view.findViewById(R.id.txt_dma120);
        final EditText edit_ma120 = (EditText)view.findViewById(R.id.edit_ma120);
        final ImageView img_ma120 = (ImageView)view.findViewById(R.id.img_ma120);
        if(maLine.get(4)!=0)
        {
            chk_ma120.setChecked(true);
            txt_dma120.setText("MA" + maLine.get(4));
            edit_ma120.setText(maLine.get(4).toString());

        }

        txt_dma120.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                txt_dma120.setVisibility(View.GONE);
                linear_maedit120.setVisibility(View.VISIBLE);
                setEditTextBroad(edit_ma120);
            }
        });
        img_ma120.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                linear_maedit120.setVisibility(View.GONE);
                txt_dma120.setVisibility(View.VISIBLE);
                txt_dma120.setText("MA" + edit_ma120.getText().toString());
            }
        });

        /**
         * MA250
         */
        final RelativeLayout linear_maedit250 = (RelativeLayout)view.findViewById(R.id.linear_maedit250);
        final CheckBox chk_ma250 = (CheckBox)view.findViewById(R.id.chk_ma250);
        final TextView txt_dma250 = (TextView)view.findViewById(R.id.txt_dma250);
        final EditText edit_ma250 = (EditText)view.findViewById(R.id.edit_ma250);
        final ImageView img_ma250 = (ImageView)view.findViewById(R.id.img_ma250);
        if(maLine.get(5)!=0)
        {
            chk_ma250.setChecked(true);
            txt_dma250.setText("MA" + maLine.get(5));
            edit_ma250.setText(maLine.get(5).toString());
        }
        txt_dma250.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                txt_dma250.setVisibility(View.GONE);
                linear_maedit250.setVisibility(View.VISIBLE);
                setEditTextBroad(edit_ma250);
            }
        });
        img_ma250.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                linear_maedit250.setVisibility(View.GONE);
                txt_dma250.setVisibility(View.VISIBLE);
                txt_dma250.setText("MA" + edit_ma250.getText().toString());
            }
        });


        TextView btn_maOK = (TextView)view.findViewById(R.id.btn_maOK);
        btn_maOK.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                // 判断是否设置了targetFragment
                //if (getTargetFragment() == null)
                    //return;

                maLine.clear();

                if(chk_ma5.isChecked()) {

                    if(chk_ma10.isChecked()) {
                        if(edit_ma5.getText().toString().equals(edit_ma10.getText().toString()))
                        {
                            Toast.makeText(getActivity(), "均线数重复!", Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                    if(chk_ma20.isChecked()) {
                        if(edit_ma5.getText().toString().equals(edit_ma20.getText().toString()))
                        {
                            Toast.makeText(getActivity(),"均线数重复!",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                    if(chk_ma60.isChecked()) {
                        if(edit_ma5.getText().toString().equals(edit_ma60.getText().toString()))
                        {
                            Toast.makeText(getActivity(),"均线数重复!",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                    if(chk_ma120.isChecked()) {
                        if(edit_ma5.getText().toString().equals(edit_ma120.getText().toString()))
                        {
                            Toast.makeText(getActivity(),"均线数重复!",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                    if(chk_ma250.isChecked()) {
                        if(edit_ma5.getText().toString().equals(edit_ma250.getText().toString()))
                        {
                            Toast.makeText(getActivity(),"均线数重复!",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }

                    maLine.add(Integer.parseInt(edit_ma5.getText().toString()));

                }else{
                    maLine.add(0);
                }
                if(chk_ma10.isChecked()) {

                    if(chk_ma20.isChecked()) {
                        if(edit_ma10.getText().toString().equals(edit_ma20.getText().toString()))
                        {
                            Toast.makeText(getActivity(),"均线数重复!",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                    if(chk_ma60.isChecked()) {
                        if(edit_ma10.getText().toString().equals(edit_ma60.getText().toString()))
                        {
                            Toast.makeText(getActivity(),"均线数重复!",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                    if(chk_ma120.isChecked()) {
                        if(edit_ma10.getText().toString().equals(edit_ma120.getText().toString()))
                        {
                            Toast.makeText(getActivity(),"均线数重复!",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                    if(chk_ma250.isChecked()) {
                        if(edit_ma10.getText().toString().equals(edit_ma250.getText().toString()))
                        {
                            Toast.makeText(getActivity(),"均线数重复!",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                    maLine.add(Integer.parseInt(edit_ma10.getText().toString()));
                }else{
                    maLine.add(0);
                }
                if(chk_ma20.isChecked()) {

                    if(chk_ma60.isChecked()) {
                        if(edit_ma20.getText().toString().equals(edit_ma60.getText().toString()))
                        {
                            Toast.makeText(getActivity(),"均线数重复!",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                    if(chk_ma120.isChecked()) {
                        if(edit_ma20.getText().toString().equals(edit_ma120.getText().toString()))
                        {
                            Toast.makeText(getActivity(),"均线数重复!",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                    if(chk_ma250.isChecked()) {
                        if(edit_ma20.getText().toString().equals(edit_ma250.getText().toString()))
                        {
                            Toast.makeText(getActivity(),"均线数重复!",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }

                    maLine.add(Integer.parseInt(edit_ma20.getText().toString()));
                }else{
                    maLine.add(0);
                }
                if(chk_ma60.isChecked()) {

                    if(chk_ma120.isChecked()) {
                        if(edit_ma60.getText().toString().equals(edit_ma120.getText().toString()))
                        {
                            Toast.makeText(getActivity(),"均线数重复!",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                    if(chk_ma250.isChecked()) {
                        if(edit_ma60.getText().toString().equals(edit_ma250.getText().toString()))
                        {
                            Toast.makeText(getActivity(),"均线数重复!",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }

                    maLine.add(Integer.parseInt(edit_ma60.getText().toString()));
                }else{
                    maLine.add(0);
                }
                if(chk_ma120.isChecked()) {

                    if(chk_ma250.isChecked()) {
                        if(edit_ma120.getText().toString().equals(edit_ma250.getText().toString()))
                        {
                            Toast.makeText(getActivity(),"均线数重复!",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }

                    maLine.add(Integer.parseInt(edit_ma120.getText().toString()));
                }else{
                    maLine.add(0);
                }
                if(chk_ma250.isChecked()) {
                    maLine.add(Integer.parseInt(edit_ma250.getText().toString()));
                }else{
                    maLine.add(0);
                }



                MaLineListener mListener = (MaLineListener)getActivity();
                mListener.MaLineOnListener(maLine);


                dismiss();
            }
        });

        return view;
    }


    /**
     * 为均线的输入框设置弹出软键盘和得到焦点
     * @param et
     */
    public void setEditTextBroad(EditText et)
    {
        et.setFocusable(true);
        et.setFocusableInTouchMode(true);
        et.requestFocus();
        et.setSelection(et.getText().toString().length());
        InputMethodManager inputManager =
                (InputMethodManager)et.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.showSoftInput(et, 0);
    }

}
 第三步,这个最简单了,做两个圆形图片作为checkbox的背景, 就完成了。
 第四步,定义一个接口,用来给Activity进行传值。
 OK,这样就实现了DialogFragment弹窗与Activity互动传值了。
 与fragment呢,就相对简单很多,像我们activity之间互动一样,使用onActivityResult的方法。这个直接看代码就OK了。
 [详细代码地址](http://download.csdn.net/detail/chenguang79/9716010)

你可能感兴趣的:(android中DialogFragment的一些使用笔记)