利用WindowManager 創建最上層的view,可控制是否可以點擊外部

/**
 * 用於分割指定繼承時圖斑選擇
 *
 * @author zuo
 * @date 2018/9/5 10:56
 */
public class SplitDataChooseDialog {
    private Context mContext;
    private View mView;
    private ISplitDataChooseListener mDataChooseListener;
    private String mOrgTBBH;
    private String mSplitTBBH;
    private List<String> mChooseTBs = new ArrayList<>();

    public interface ISplitDataChooseListener {
        /**
         * 選擇的圖斑
         *
         * @param chooseTBs
         */
        void onResult(List<String> chooseTBs);

        /**
         * 原始圖斑是否選中
         *
         * @param isChecked
         */
        void onCheckOrgTB(boolean isChecked);

        /**
         * 分割後的圖斑是否選中
         *
         * @param isChecked
         */
        void onCheckSplitTB(boolean isChecked);
    }

    /**
     * @param orgTBBH   - 原始圖斑編號
     * @param splitTBBH - 分割後的圖斑編號
     * @param listener  - 完成選擇繼承圖斑的監聽事件
     */
    public SplitDataChooseDialog(IGeometryEngine hook, @NonNull String orgTBBH, @NonNull String splitTBBH,
                                 ISplitDataChooseListener listener) {
        this.mContext = hook.getContext();
        this.mView = hook.getMapView().getRootView();
        this.mOrgTBBH = orgTBBH;
        this.mSplitTBBH = splitTBBH;
        this.mDataChooseListener = listener;
    }

    public void show() {
        final View view = LayoutInflater.from(mContext).inflate(R.layout.choose_split_data, null);
        final CheckBox cbDataOrg = view.findViewById(R.id.cb_data_org);
        cbDataOrg.setText(mOrgTBBH);
        final CheckBox cbDataSplit = view.findViewById(R.id.cb_data_split);
        cbDataSplit.setText(mSplitTBBH);
        final WindowManager mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        mWindowManager.addView(view, createWindowLayoutParams());
        cbDataOrg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                mDataChooseListener.onCheckOrgTB(cbDataOrg.isChecked());
            }
        });
        cbDataSplit.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                mDataChooseListener.onCheckSplitTB(cbDataSplit.isChecked());
            }
        });
        view.findViewById(R.id.btn_sure).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (cbDataOrg.isChecked()) {
                    mChooseTBs.add(mOrgTBBH);
                }
                if (cbDataSplit.isChecked()) {
                    mChooseTBs.add(mSplitTBBH);
                }
                if (mChooseTBs.size() <= 0) {
                    Toast.makeText(mContext, "請最少選擇一個圖斑!", Toast.LENGTH_SHORT).show();
                } else {
                    mDataChooseListener.onResult(mChooseTBs);
                    mWindowManager.removeView(view);
                }
            }
        });
    }

    private WindowManager.LayoutParams createWindowLayoutParams() {
        WindowManager.LayoutParams p = new WindowManager.LayoutParams();
        p.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
        p.width = WindowManager.LayoutParams.WRAP_CONTENT;
        p.height = WindowManager.LayoutParams.WRAP_CONTENT;
        p.format = PixelFormat.TRANSLUCENT;
        //作爲系統窗口 需要權限
        p.type = WindowManager.LayoutParams.TYPE_APPLICATION;
        //控制佈局區域外是否可以點擊
        p.flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
        p.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED;
        //p.token = token;
        return p;
    }
    
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章