自定義Dialog底部彈出,dialog嵌套一個listView可滑動,實現多選底部彈窗,點擊空白處消失

底部彈窗是我Android李一個比較多的應用啦,自定義的流程就不說啦,資料很多。直接貼代碼。這裏記錄一下減少開發成本:

1.自定義一個dialog:



import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.List;

import creativity.intelligence.software.sidus.link.R;

/**
 * Created by ${asy} on 2018/12/19.
 * https://blog.csdn.net/qXing123456789/article/details/83272671
 * G:\Wader\KxBottomDialog
 */

public class BottomCirTraDialogNo extends Dialog /*implements AdapterView.OnItemClickListener*/ {

    private List<String> mList;
    private SelectDialogListener mListener;
    private Activity mActivity;
    private boolean mUseCustomColor = false;
    private int mFirstItemColor;
    private int mOtherItemColor;
    private Button mBtnCancel, btnBack, btnChoice;
    private int location;
    private SelectDialogCancelListener mCancelListener;
    public DialogAdapter dialogAdapter;
    private Window window;
    private Context context;

    public BottomCirTraDialogNo(@NonNull Context context) {
        super(context);
    }

    public BottomCirTraDialogNo(Activity activity, int theme, SelectDialogListener listener, List<String> names) {
        super(activity, theme);
        mActivity = activity;
        mListener = listener;
        mList = names;

        this.window = getWindow();
//        setLightNavigationBar();
//        hideBottomUIMenu();
//        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        //點擊Dialog外部消失
        setCanceledOnTouchOutside(true);
    }

    public interface SelectDialogCancelListener {
        void onCancelClick(View v);
    }

    public interface SelectDialogListener {
        void onItemClick(AdapterView<?> parent, View view, int position, long id, Button btn, TextView itemText);
    }

    private void hideBottomUIMenu() {
        //隱藏虛擬按鍵,並且全屏
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //for new api versions.
//            View decorView = getWindow().getDecorView();
//            int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
//                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
//                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
//                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
////                    | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
//                    | View.SYSTEM_UI_FLAG_IMMERSIVE;
//            decorView.setSystemUiVisibility(uiOptions);
//            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
    }

    @SuppressLint("InlinedApi")
    private void setLightNavigationBar() {
//        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setNavigationBarColor(mActivity.getResources().getColor(R.color.color_ff3a3a3a));  //#fafafa


    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            window.setNavigationBarColor(ContextCompat.getColor(mActivity, R.color.color_ff3a3a3a));
        }
        View view;
        if (mList.get(0).equals(getContext().getResources().getString(R.string.Settings_signout_confirm))) {
            view = getLayoutInflater().inflate(R.layout.dialog_exam_type_login_out, null);
        } else {
            view = getLayoutInflater().inflate(R.layout.dialog_exam_type, null);
        }
        setContentView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        Window window = getWindow();

        //設置動畫
        window.setWindowAnimations(R.style.main_menu_animstyle);
        WindowManager.LayoutParams attributes = window.getAttributes();
        attributes.x = 0;
        attributes.y = mActivity.getWindowManager().getDefaultDisplay().getHeight();

        //保證按鈕水平滿屏
        attributes.width = ViewGroup.LayoutParams.MATCH_PARENT;
        attributes.height = ViewGroup.LayoutParams.WRAP_CONTENT;
        //設置顯示位置
        onWindowAttributesChanged(attributes);

        initView();
    }

    @SuppressLint("ResourceAsColor")
    private void initView() {
        dialogAdapter = new DialogAdapter(mList);
        ListView listView = (ListView) findViewById(R.id.dialog_list);
        mBtnCancel = (Button) findViewById(R.id.btn_cancel);
        btnBack = (Button) findViewById(R.id.btnBack);
        btnChoice = (Button) findViewById(R.id.btnChoice);
//        listView.setOnItemClickListener(this);
        listView.setAdapter(dialogAdapter);
        mBtnCancel.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mCancelListener != null) {
                    mCancelListener.onCancelClick(v);
                }
                dismiss();
            }
        });
        btnBack.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mCancelListener != null) {
                    mCancelListener.onCancelClick(v);
                }
                dismiss();
            }
        });

        btnChoice.setVisibility(View.GONE);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.v("aaaa", "click");
                dialogAdapter.setCurrentItem(position);
                dialogAdapter.setClick(true);
                mListener.onItemClick(parent, view, position, id, btnChoice, dialogAdapter.viewholder.dialogItemButton);
                dialogAdapter.notifyDataSetChanged();
                dismiss();
            }
        });

    }

    private class DialogAdapter extends BaseAdapter {
        private List<String> mStrings;
        public Viewholder viewholder;
        private LayoutInflater layoutInflater;
        private int mCurrentItem = 0;
        private boolean isClick = false;

        public DialogAdapter(List<String> strings) {
            this.mStrings = strings;
            this.layoutInflater = mActivity.getLayoutInflater();
        }

        @Override
        public int getCount() {
            return mStrings.size();
        }

        @Override
        public Object getItem(int position) {
            return mStrings.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (null == convertView) {
                viewholder = new Viewholder();
                convertView = layoutInflater.inflate(R.layout.view_dialog_item, null);
                viewholder.dialogItemButton = (TextView) convertView.findViewById(R.id.dialog_item_bt);
                viewholder.mRelativeLayout = (RelativeLayout) convertView.findViewById(R.id.rlItem);
                convertView.setTag(viewholder);
            } else {
                viewholder = (Viewholder) convertView.getTag();
            }
            viewholder.dialogItemButton.setText(mStrings.get(position));
            viewholder.dialogItemButton.setTextColor(mActivity.getResources().getColor(R.color.textcolor_2));
            viewholder.dialogItemButton.setEnabled(true);
            //已經獲取過協作碼
            if (mStrings.get(position).equals(mActivity.getResources().getString(R.string.group_created_code_in_menu)) && SaveDataUtils.getData("currentTime", 0) != null && (int) SaveDataUtils.getData("currentTime", 0) != 0) {
                viewholder.dialogItemButton.setTextColor(mActivity.getResources().getColor(R.color.textcolor_4));
                viewholder.dialogItemButton.setEnabled(false);
            }
            //已經添加兩個成員
            if (mStrings.get(position).equals(mActivity.getResources().getString(R.string.group_created_code_in_menu)) && SaveDataUtils.getData("isHaveTwo", false) != null && (boolean) SaveDataUtils.getData("isHaveTwo", false)){
               Log.v("geno","獲取協作碼" + position);
                viewholder.dialogItemButton.setTextColor(mActivity.getResources().getColor(R.color.textcolor_4));
                viewholder.dialogItemButton.setEnabled(false);
            }
            //已經添加兩個成員
           if (mStrings.get(position).equals(mActivity.getResources().getString(R.string.group_created_add_in_menu)) && SaveDataUtils.getData("isHaveTwo", false) != null && (boolean) SaveDataUtils.getData("isHaveTwo", false)) {
               Log.v("geno","添加協作成員" + position);
                viewholder.dialogItemButton.setTextColor(mActivity.getResources().getColor(R.color.textcolor_4));
                viewholder.dialogItemButton.setEnabled(false);
            }
            if (!mUseCustomColor) {
                mFirstItemColor = mActivity.getResources().getColor(R.color.itemtextcolor);
//                mOtherItemColor = mActivity.getResources().getColor(R.color.textColor);
            }

            viewholder.dialogItemButton.setBackgroundResource(R.drawable.select_dialog_item_bg_center);
            return convertView;
        }

        public void setCurrentItem(int currentItem) {
            this.mCurrentItem = currentItem;
        }

        public void setClick(boolean click) {
            this.isClick = click;
        }

    }

    public static class Viewholder {
        public TextView dialogItemButton;
        private RelativeLayout mRelativeLayout;
    }
   /* @Override
    public void show() {
        ToolUtils.focusNotAle(window);
        super.show();
        ToolUtils.hideNavigationBar(window);
        ToolUtils.clearFocusNotAle(window);
    }*/
}

2.建立一個佈局工dialog加載:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/shape_bootom_no_config"
    android:gravity="bottom"
    android:orientation="vertical">
    <RelativeLayout
        android:id="@+id/rlBack"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <Button
            android:id="@+id/btnBack"
            android:layout_width="40dp"
            android:layout_height="4dp"
            android:layout_marginTop="@dimen/dp_20"
            android:layout_marginBottom="@dimen/dp_20"
            android:layout_centerHorizontal="true"
            android:background="@drawable/shape_button_green" />
        <Button
            android:visibility="gone"
            android:id="@+id/btnChoice"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_alignParentEnd="true"
            android:layout_alignParentTop="true"
            android:layout_marginEnd="32dp"
            android:background="@null"
            android:textSize="16sp"
            android:text="@string/general_action_confirm"
            android:textColor="@color/green"
            android:textAllCaps="false"/>
        <TextView
            android:layout_below="@+id/btnBack"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_50"
            android:layout_marginStart="@dimen/dp_50"
            android:layout_marginEnd="@dimen/dp_50"
            android:gravity="center_horizontal"
            android:text="@string/Settings_signout_tips"
            android:textSize="@dimen/sp_16"
            android:textColor="@color/green"/>

    </RelativeLayout>


    <ListView
        android:id="@+id/dialog_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/dp_8"
        android:divider="@drawable/main_list_divider_line"
        android:cacheColorHint="@android:color/transparent"
        android:dividerHeight="0.5dp"
        android:listSelector="@android:color/transparent" />
    <!-- android:divider="#DAD9DB"item分割綫顔色-->
    <Button
        android:id="@+id/btn_cancel"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_marginTop="5dip"
        android:background="@drawable/dialog_item_bg_only"
        android:gravity="center"
        android:text="@string/cancel"
        android:textColor="#0073FF"
        android:textSize="18sp"
        android:visibility="gone" />

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <LinearLayout
        android:background="@drawable/shape_bootom_no_config"
        android:gravity="bottom"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <RelativeLayout
            android:id="@+id/rlBack"
            android:layout_gravity="center"
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:layout_marginTop="@dimen/dp_7"
            >
            <Button
                android:id="@+id/btnBack"
                android:layout_width="40dp"
                android:layout_height="4dp"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:background="@drawable/shape_button_green" />
            <Button
                android:visibility="gone"
                android:id="@+id/btnChoice"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_alignParentEnd="true"
                android:layout_alignParentTop="true"
                android:gravity="right|center_vertical"
                android:layout_marginEnd="@dimen/dp_37"
                android:background="@null"
                android:textSize="16sp"
                android:text="@string/general_action_confirm"
                android:textColor="@color/green"
                android:textAllCaps="false"/>
        </RelativeLayout>


        <ListView
            android:id="@+id/dialog_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/dp_8"
            android:divider="@drawable/main_list_divider_line"
            android:cacheColorHint="@android:color/transparent"
            android:dividerHeight="0.5dp"

            android:listSelector="@android:color/transparent" />
        <!-- android:divider="#DAD9DB"item分割綫顔色-->
        <Button
            android:id="@+id/btn_cancel"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginTop="5dip"
            android:background="@drawable/dialog_item_bg_only"
            android:gravity="center"
            android:text="@string/cancel"
            android:textColor="#0073FF"
            android:textSize="18sp"
            android:visibility="gone" />
    </LinearLayout>
</LinearLayout>

 

最後就是在Activity中調用啦:

    private BottomCirTraDialogNo dialog;
 /**
     * 底部列表彈窗
     */
    private void groupListView(final List<String> name) {

        showDialog((parent, view, position, id, btn, itemText) -> {
            itemText.setTextColor(getResources().getColor(R.color.green));
            switch (position) {
                case 0:
                    clearAppFile();
                    clearDb();
                    ActivityMangerUtil.getInstance().OutSign();
                    Intent intent = new Intent(SettingActivity.this, HomeActivity.class);
                    startActivity(intent);
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            PersonalManger.questyLoginOut(mMyOkhttp, UrlConfig.USER_LONIN_OUT);
                        }
                    }).start();

                    break;
                case 1://取消

                    break;
            }
            dialog.dismiss();
        }, name);
    }

    private void showDialog(BottomCirTraDialogNo.SelectDialogListener listener, List<String> names) {

        dialog = new BottomCirTraDialogNo(getActivity(), R.style.transparentFrameWindowStyle, listener, names);
        if (!getActivity().isFinishing()) {
            dialog.show();
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章