1. 程式人生 > >安卓-三種類型的彈出框

安卓-三種類型的彈出框

安卓-三種類型的彈出框

做安卓開發以來,大體用過三種形式的彈出框,實現的效果差不多,只是資料處理的方式不同,根據不同的需求選擇合適的彈出框,樣式要根據自己的需求更改。

  • 第一種:安卓自帶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