安卓-三种类型的弹出框

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Daxue_haha/article/details/53516519

安卓-三种类型的弹出框

做安卓开发以来,大体用过三种形式的弹出框,实现的效果差不多,只是数据处理的方式不同,根据不同的需求选择合适的弹出框,样式要根据自己的需求更改。

  • 第一种:安卓自带AlertDialog
  • 第二种:popwindow
  • 第三种:activity类型自定义的弹出框

来看下效果图

这里写图片描述

第一种:安卓自带AlertDialog

第一种比较简单,代码量很少,鉴于现在安卓版本的提升,自带的很多控件的样式其实也并不难看,只要不是特殊的需求,一般可以直接使用,这个不多说,下面是一个适用于ListView的弹出框。

代码

直接写成一个方法,参数可以自己定义,因为可能一个页面会用到多个dialog,这里传入的是一个动态的list,也可以直接扔过去一个数组。

 private void selectTypeDiag(final List<String> list) {
        int len=list.size();
        final String items[]=new String[len];//不能直接用list.size,会出错
        for (int i=0;i<list.size();i++){
         items[i]=list.get(i);
        }
        //dialog参数设置
        AlertDialog.Builder builder = new AlertDialog.Builder(this);  //先得到构造器
          builder.setTitle("请选择"); //设置标题
        //builder.setMessage("是否确认退出?"); //设置内容
        //builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
        //设置列表显示,注意设置了列表显示就不要设置builder.setMessage()了,否则列表不起作用。
        builder.setItems(items, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
               tv_text.setText(items[which]);
            }
        });
        builder.create();
        builder.create().show();
    }

第二种:popwindow

popwindow与第一种相比灵活性比较大,可以自定义布局文件,可以添加动画,自定义弹出方位。

代码

一、首先定义一个popwindow,layout和动画可以自己定义,代码里都有注释。

public class PopShowView extends PopupWindow {
    private LayoutInflater layoutInflater;
    private View popView;
    private List<String> infoList;
    private ListView lv_leavetype;
    private PopShowAdapter popLeaveTypeAdapter;
    private Context context;
    private LinearLayout pop_layout;
    private PopLeaveTypeListener popLeaveTypeListener;

    public PopShowView(Context context, List<String> infoList) {
        this.layoutInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.context = context;
        this.infoList = infoList;
        init();
    }

    private void init() {
        popView = layoutInflater.inflate(R.layout.pop_window_leavetype, null);
        lv_leavetype = (ListView) popView.findViewById(R.id.lv_leavetype);
        pop_layout = (LinearLayout) popView.findViewById(R.id.pop_layout);

        if (infoList != null) {
            popLeaveTypeAdapter = new PopShowAdapter(context, infoList);
            lv_leavetype.setAdapter(popLeaveTypeAdapter);
            lv_leavetype.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    if (popLeaveTypeListener != null) {
                        popLeaveTypeListener.clickData(infoList.get(position));
                    }
                    dismiss();
                }
            });
        }


        //把View添加到PopWindow中
        this.setContentView(popView);
        //设置SelectPicPopupWindow弹出窗体的宽
        this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
        //设置SelectPicPopupWindow弹出窗体的高
        this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        //设置SelectPicPopupWindow弹出窗体可点击
        this.setFocusable(true);
        //设置SelectPicPopupWindow弹出窗体动画效果
        this.setAnimationStyle(R.style.BottomPopWindowAnimation);

//        this.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//实例化一个ColorDrawable颜色为透明

        //实例化一个ColorDrawable颜色为半透明
        ColorDrawable dw = new ColorDrawable(0x6f000000);
        //设置SelectPicPopupWindow弹出窗体的背景
        this.setBackgroundDrawable(dw);
        popView.setOnTouchListener(new View.OnTouchListener() {//设置背景区域外为点击消失popwindow
            public boolean onTouch(View v, MotionEvent event) {

                int height = popView.findViewById(R.id.pop_layout).getTop();
                int y = (int) event.getY();
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    if (y < height) {
                        dismiss();
                    }
                }
                return true;
            }
        });
    }

    public void setClickDataListener(PopLeaveTypeListener popLeaveTypeListener) {
        this.popLeaveTypeListener = popLeaveTypeListener;
    }

//    @Override
//    public void onClick(View arg0) {
//        switch (arg0.getId()) {
//            case R.id.iv_close_pop:
//                dismiss();
//                break;
//            default:break;
//        }
//    }

}

二、因为要添加点击事件,并且需要在activity里面获取到list里面的数据,所以还要在写一个监听器PopLeaveTypeListener 。

/**
 * Created by Daxue on 2016/12/2.
 */

public interface PopLeaveTypeListener {
        void clickData(String data);//数据类型根据自己list的类型定义
}

三、下面是activity里面TextView的点击事件。

case R.id.tv_thetwo:
                   PopShowView popshow = new PopShowView(this, mData);
                if (popshow.isShowing()) {
                    popshow.dismiss();
                } else {
//              myPopWindowBottomShow.showAsDropDown(bottom_popwindow);//popwindow放在子控件bottom_popwindow下面Ps:如果手机有虚拟按键的话popwindow将显示不完全
                    popshow.showAtLocation(this.findViewById(R.id.activity_main), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);//这种方式无论有虚拟按键还是没有都可完全显示,因为它显示的在整个父布局中
                }
                popshow.setClickDataListener(new PopLeaveTypeListener() {

                    @Override
                    public void clickData(String data) {
                        //   Toast.makeText(getContext(),
                        //           year + "-" + month + "-" + day, Toast.LENGTH_SHORT).show();
                        //     setAddPopwindowShowData(day,month,year);
                        tv_thetwo.setText(data + "");

                    }
                });
                break;

第三种:activity类型的dialog

一、首先定义activity的主题theme

 <style name="Dialog" parent="android:style/Theme.Dialog">
        <item name="android:background">#00000000</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
 </style>

二、DialogActivity

public class DialogActivity extends Activity implements
        View.OnClickListener {
    private static final String TAG="DialogActivity";
   private TextView tv_remark,tv_submit;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_signalertdialog);
        //定义弹出框,防止弹出框的高度和宽度变形
        WindowManager m = getWindowManager();
        Display d = m.getDefaultDisplay();//为获取屏幕宽、高  
        WindowManager.LayoutParams p = getWindow().getAttributes();//获取对话框当前的参数值  
        p.height = (int) (d.getHeight() * 1.0);//高度设置为屏幕的1.0
        p.width = (int) (d.getWidth() * 1.0); //宽度设置为屏幕的1.0
        //p.alpha = 1.0f;//设置本身透明度
        p.dimAmount = 0.8f; //设置黑暗度
        getWindow().setAttributes(p);//设置生效
        initView();
        initListener();
    }

    private void initView() {
        tv_submit= (TextView) findViewById(R.id.tv_submit);
    }

    private void initListener() {
        tv_submit.setOnClickListener(this);
    }
    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onStop() {
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.tv_submit:
                Intent mIntent = new Intent();
                mIntent.putExtra("submit","submit");
                // 设置结果,并进行传送
                setResult(2, mIntent);
                finish();
                break;
            default:
                break;
        }
    }

三、在AndroidManifest里面注册activity

<activity android:name=".DialogActivity"
            android:theme="@style/Dialog"/>

四、在activity里面写监听事件

//textview的点击事件
case R.id.tv_three:
                Intent intent = new Intent(this, DialogActivity.class);
                startActivityForResult(intent, 2);
                break;


//dialog activity的返回的结果处理
  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == 2) {
            if (data != null) {
                tv_thethree.setText(data.getStringExtra("submit"));
            } else {
                tv_thethree.setText("第三种:Activity Dialog");
            }
        }
    }

下载Demo

猜你喜欢

转载自blog.csdn.net/Daxue_haha/article/details/53516519