自定义Dialog界面和功能


前言

因为最近开发的需要 做了一个自定义Android的dialog 这里做一下记录

一、Dialog是什么

Dialog翻译过来就是对话,dialog日常使用一般就是询问对话,是否下载,是否打开之类的一些对话,但在有些时候你需要打开一个新界面实现一些简单功能,新建activity又耗时耗内存,那就可以使用dialog,我一般叫做弹窗,实现对话的就是对话弹窗,实现功能的就是功能弹窗。

二、功能介绍

这边要实现的是一个列表弹窗,可以添加删除还有下载指定item的功能,效果图如下:

三、界面设计

1.List item设计

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:descendantFocusability="blocksDescendants"
        android:layout_width="match_parent"
        android:layout_height="75dp"
        android:paddingBottom="5pt">
		//这里的图片可以替换成自己的,也可以不要
        <ImageView
            android:id="@+id/imageView_headpic"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_marginTop="5pt"
            android:layout_marginRight="10pt"
            android:src="@drawable/cft1" />

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="70dp"
            android:layout_marginTop="6pt"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tv_dialog_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Name"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:textColor="#367EAA" />


            <TextView
                android:id="@+id/tv_dialog_size"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="TextView"
                android:textColor="#818095" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="150dp"
            android:layout_height="80dp"
            android:layout_alignParentRight="true"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/tv_dialog_number"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:layout_marginRight="15dp"
                android:gravity="center"
                android:text="Textview"
                android:textColor="#818095" />
        <Button
            android:text="加载"
            android:id="@+id/btn_dialog_load"
            android:layout_width="70dp"
            android:layout_height="35dp"
            android:layout_marginTop="20dp"
            android:alpha="0.5"
            android:background="@drawable/button_rounded_background" />


        </LinearLayout>
    </RelativeLayout>

</LinearLayout>

在这里插入图片描述
每一个item的样式

2.ListView布局设计

这里面有三个按钮 被我默认不加载了 可以在java里面设置显示,
或者可以在Button控件上把visibility设置为visible。
在这里插入图片描述

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black">

    <EditText
        android:singleLine="true"
        android:textColor="@color/white"
        android:textColorHint="@color/white"
        android:id="@+id/ed_dialog_search"
        android:hint="搜索"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="30dp"
        android:textSize="15dp"
        android:layout_width="660dp"
        android:layout_height="45dp"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal">

        <Button
            android:visibility="gone"
            android:text="添加处方图"
            android:id="@+id/btn_dialog_first"
            android:background="@drawable/button_rounded_background"
            android:layout_margin="10dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"/>


        <Button
            android:visibility="gone"
            android:text="搜索"
            android:id="@+id/btn_dialog_second"
            android:background="@drawable/button_rounded_background"
            android:layout_margin="10dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"/>


        <Button
            android:visibility="gone"
            android:text="null"
            android:id="@+id/btn_dialog_third"
            android:background="@drawable/button_rounded_background"
            android:layout_margin="10dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"/>

    </LinearLayout>



    <ListView
        android:id="@+id/lv_dialog"
        android:layout_margin="10dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>

</LinearLayout>

2.MainActivity布局设计

添加一个Button

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">


    <Button
    	//这个按钮样式可以删除使用默认的或者自定义
        android:background="@drawable/button_rounded_background"
        android:id="@+id/bt_main_dialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

三、DialogAdapter类,继承BaseAdapter

public class DialogAdapter extends BaseAdapter {
    private List<Map<String,Object>> data;
    private LayoutInflater layoutInflater;
    private Context context;
    private  onClickListening onClickListening;
    
	//item上按钮功能的接口
    public interface onClickListening{

        View.OnClickListener onClickListeningItemButton(int position);

    }
    public DialogAdapter setOnClickListening(onClickListening listening){
        this.onClickListening = listening;
        return this;
    }
	
	//构造函数
    public DialogAdapter(Context context,List<Map<String,Object>> data){
        this.context = context;
        this.data = data;
        this.layoutInflater = LayoutInflater.from(context);

    }

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

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

    @Override
    public long getItemId(int position) {
        return position;
    }
    
    //更新ListView界面
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String[] strings = new String[3];
        strings[0] = "name";
        strings[1] = "number";
        strings[2] = "size";
        DialogListItem dialogListItem = new DialogListItem(strings);
        convertView = layoutInflater.inflate(R.layout.dialog_item_style,null);
        dialogListItem.tv_dialog_name = convertView.findViewById(R.id.tv_dialog_name);
        dialogListItem.tv_dialog_number = convertView.findViewById(R.id.tv_dialog_number);
        dialogListItem.tv_dialog_size = convertView.findViewById(R.id.tv_dialog_size);
        dialogListItem.btn_dialog_load = convertView.findViewById(R.id.btn_dialog_load);
        dialogListItem.tv_dialog_name.setText(data.get(position).get(dialogListItem.datakey[0]).toString());
        dialogListItem.tv_dialog_number.setText(data.get(position).get(dialogListItem.datakey[1]).toString());
        dialogListItem.tv_dialog_size.setText(data.get(position).get(dialogListItem.datakey[2]).toString());
        dialogListItem.btn_dialog_load.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onClickListening.onClickListeningItemButton(position);
            }
        });
        return convertView;
    }


}

四.Dialog类

//接口
 public interface onClickListenner {
        //第一个按钮
        void onClickListennerFirst();
        //第二个按钮
        void onClickListennerSecond();
        //第三个按钮
        void onClickListennerThird();
        //item里面的按钮
        void onItemButton(int position);
        
        List<Map<String, Object>> getData();
    }
    
     public Dialog setOnClikcListenner(onClickListenner listenner) {
        this.onClickListenner = listenner;
        return this;
    }
public Dialog(@NonNull Context context) {
        super(context);
        this.context= context;

    }
//这里的int i是开启按钮的个数,最多三个 最少0个
    public Dialog(@NonNull Context context, int i) {
        super(context);
        this.context= context;
        btnNumber = i;
    }
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_dialog);
        initView(btnNumber);
        initEvent();
        dataList = onClickListenner.getData();
        showListView(dataList);
        this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
 //初始化控件
    public void initView(int i) {
        int visible = 0;
        if (i == 1) {
            btn_dialog_first = findViewById(R.id.btn_dialog_first);
            btn_dialog_first.setVisibility(visible);

        } else if (i == 2) {
            btn_dialog_first = findViewById(R.id.btn_dialog_first);
            btn_dialog_second = findViewById(R.id.btn_dialog_second);
            btn_dialog_first.setVisibility(visible);
            btn_dialog_second.setVisibility(visible);
       
        } else {
            btn_dialog_first = findViewById(R.id.btn_dialog_first);
            btn_dialog_second = findViewById(R.id.btn_dialog_second);
            btn_dialog_third = findViewById(R.id.btn_dialog_third);
            btn_dialog_first.setVisibility(visible);
            btn_dialog_second.setVisibility(visible);
            btn_dialog_third.setVisibility(visible);
        }
			lv_dialog = findViewById(R.id.lv_dialog);
            ed_dialog_search =findViewById(R.id.ed_dialog_search);
    }
    }
   //初始化监听事件
    public void initEvent() {
        //按钮监听
        btn_dialog_first.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onClickListenner != null) {
                    onClickListenner.onClickListennerFirst();
                }
            }
        });
        btn_dialog_second.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onClickListenner != null) {
                    onClickListenner.onClickListennerSecond();
                }
            }
        });
        btn_dialog_third.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onClickListenner != null) {
                    onClickListenner.onClickListennerThird();
                }
            }
        });
        //软键盘监听,将EditView里软键盘的回车键改为点击搜索,点击搜索就关闭软键盘
        ed_dialog_search.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
        ed_dialog_search.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId==EditorInfo.IME_ACTION_SEARCH||(event!=null&&event.getKeyCode()== KeyEvent.KEYCODE_ENTER))
                {	
                	//搜索方法
                    dialogSearch();

                    InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                    if(imm.isActive()&&getCurrentFocus()!=null){
                        if (getCurrentFocus().getWindowToken()!=null) {
                            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                        }
                    }

                }
                return false;
            }
        });
        //EditText监听,当搜索框内文本被修改就开始检索。
        ed_dialog_search.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {		//搜索方法
                dialogSearch();
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
    }

这里分开两个列表更新方法使用,一个是搜索用,防止原本的数据修改。

 //更新List,并刷新页面
    public void showListView(List<Map<String,Object>> list) {
        dataList = list;
        dialogAdapter = new DialogAdapter(context, dataList);
        dialogAdapter.setOnClickListening(new DialogAdapter.onClickListening() {
            @Override
            public View.OnClickListener onClickListeningItemButton(int position) {
                onClickListenner.onItemButton(position);
                return null;
            }
        });
        lv_dialog.setAdapter(dialogAdapter);
        //列表监听,长按删除item
        lv_dialog.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d("TAG", "onItemClick: 点击了 "+list.get(position).get("name"));
            }
        });
        lv_dialog.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                list.remove(position);
                dialogAdapter = new DialogAdapter(context, list);
                dialogAdapter.setOnClickListening(new DialogAdapter.onClickListening() {
                    @Override
                    public View.OnClickListener onClickListeningItemButton(int position) {
                        onClickListenner.onItemButton(position);
                        return null;
                    }
                });
                lv_dialog.setAdapter(dialogAdapter);
                return false;
            }
        });
    }
    //仅刷新页面,不修改List数据
    public void showListView2(List<Map<String,Object>> list){
        dialogAdapter = new DialogAdapter(context, list);
        dialogAdapter.setOnClickListening(new DialogAdapter.onClickListening() {
            @Override
            public View.OnClickListener onClickListeningItemButton(int position) {
                onClickListenner.onItemButton(position);
                return null;
            }
        });
        lv_dialog.setAdapter(dialogAdapter);
    }
//搜索列表的方法,按照name查询
    public void dialogSearch(){
        String ss = ed_dialog_search.getText().toString();
        if (!ss .equals("")){
            alist.clear();
            for (int i =0;i<dataList.size();i++){
                Log.d(TAG, "dialogSearch: "+1);
                if (dataList.get(i).get("name").toString().indexOf(ss,dataList.get(i).get("name").toString().length()-1) != -1){
                    alist.add(dataList.get(i));
                }
                String[] aa = dataList.get(i).get("name").toString().split(ss);
                if (aa.length>1){
                    alist.add(dataList.get(i));
                }
                showListView2(alist);
            }
        }else showListView2(dataList);
    }
 //添加信息的方法,在MainActivity里面用
    public void dialogAdd(Map a){
        dataList.add(a);
        showListView(dataList);
    }

# 五.DialogListItem类
public class DialogListItem {
   public TextView tv_dialog_name , tv_dialog_number,tv_dialog_size;
   public ImageView ig_dialog_del;
   public Button btn_dialog_load;
   public String[] datakey;//map数据里面对应的key名
   public DialogListItem(String[] s) {
        datakey = s;
   }
}

五.DialogListItem类

 private int btnNumber = 3;
    private ListView lv_dialog;
    public EditText ed_dialog_search;
    private Button btn_dialog_first, btn_dialog_second, btn_dialog_third;
    private onClickListenner onClickListenner;
    private Context context;
    public DialogAdapter dialogAdapter;
    List<Map<String,Object>> dataList =new ArrayList<Map<String, Object>>();;//实时的列表
    List<Map<String, Object>> alist = new ArrayList<Map<String, Object>>();//查询用list

六.MainActivity功能实现

1.初始化控件,这里不展示代码。

2.功能实现

 View.OnClickListener l = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Dialog dialog = new Dialog(MainActivity.this);
            dialog.setTitle("Test");
            dialog.setOnClikcListenner(new Dialog.onClickListenner() {
                int i = 0;
                @Override
                public void onClickListennerFirst() {
                    Map<String, Object> map = new HashMap<String, Object>();
                    i++;
                    String a = "测试"+i;
                    map.put("name",a);
                    map.put("size","100kb");
                    map.put("number",i);
                    Log.d(TAG, "onClickListennerFirst: " +map);
                    dialog.dialogAdd(map);
                    mToast("添加成功");
                }

                @Override
                public void onClickListennerSecond() {
                    dialog.dialogSearch();
                    mToast("搜索完成");
                }

                @Override
                public void onClickListennerThird() {

                }

                @Override
                public void onItemButton(int position) {

                }

                //ListView里面List的数据
                @Override
                public List<Map<String, Object>> getData() {
                    return list;
                }
            });
            dialog.show();
        }
    };
    //冒泡消息
    public void mToast(String text) {


        if (mToast == null) {
            mToast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
        } else {
            mToast.setText(text);
        }
        mToast.show();
   }
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小周bb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值