对于弹出框,我经常使用的是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
public class myDialog extends DialogFragment {
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))
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())
}
})
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())
}
})
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())
}
})
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())
}
})
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())
}
})
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
}
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)