Android之自定义View之底部选择弹窗

news2024/11/19 19:39:37

一、底部选择弹窗

效果:
在这里插入图片描述

1、自定义类

可自定义item数量的底部弹窗

(1)CustomBottomPop自定义类
package com.custom.jfrb.ui.first.customView; //自己的包位置

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.custom.jfrb.R;
import com.custom.jfrb.base.BasePopupWindow;
import com.custom.jfrb.ui.first.base.CustomPopListener;
import com.custom.jfrb.ui.first.bean.PopBean;

import org.droidparts.annotation.inject.InjectView;

import java.util.List;

/**
 * 一个自定义item数量的底部弹出窗
 */
public class CustomBottomPop extends BasePopupWindow {

    @InjectView(id = R.id.tv_cancel, click = true)
    TextView tvCancel;

    @InjectView(id = R.id.ll_root)
    LinearLayout llRoot;

    List<PopBean> data ;
    CustomPopListener mMustomPopListener;

    public CustomBottomPop(Context context, List<PopBean> list, CustomPopListener customPopListener) {
        super(context);
        this.data = list;
        this.mMustomPopListener = customPopListener;
        refresh();
    }

    public void refresh() {
        clearItem();
        for (PopBean bean : data) {
            addItem(bean);
        }
    }

    public void refresh(List<PopBean> list) {
        this.data = list;
        refresh();
    }

    Object object;

    @Override
    public View setPopview() {
        return LayoutInflater.from(getContext()).inflate(R.layout.popup_bottom_custom, null);
    }

    public void clearItem() {
        llRoot.removeAllViews();
    }

    private void addItem(final PopBean bean) {
        View view = LayoutInflater.from(getContext()).inflate(R.layout.item_pop, null);
        TextView textView = (TextView) view.findViewById(R.id.tv_button);
        textView.setText(bean.getValue());
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mMustomPopListener.onClickButton(CustomBottomPop.this,bean);
            }
        });
        llRoot.addView(view);
    }

    @Override
    public void onClick(View v) {
      if (v == tvCancel) {
            dismiss();
        }
    }

    public Object getObject() {
        return this.object;
    }

    public void setObject(Object object) {
        this.object = object;
    }
}

(2)继承的BasePopupView类
package com.custom.jfrb.base;

import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.PopupWindow;

import com.custom.jfrb.R;

import org.droidparts.Injector;
import org.droidparts.bus.EventBus;

/**
 * Created by Administrator on 2015/7/9 0009.
 */
public abstract class BasePopupWindow extends PopupWindow implements View.OnClickListener
{

    public Context context;


    public BasePopupWindow(Context context)
    {

        this.context = context;
        onInit();
    }

    public Context getContext()
    {
        return this.context;
    }

    private void onInit()
    {

        setWidth(LinearLayout.LayoutParams.MATCH_PARENT);
        setHeight(LinearLayout.LayoutParams.MATCH_PARENT);
        View inflate = setPopview();
        setContentView(inflate);
        setBackgroundDrawable(new BitmapDrawable());
        Injector.inject(getContentView(), this);
        EventBus.unregisterAnnotatedReceiver(this);
        EventBus.registerAnnotatedReceiver(this);


        setAnimationStyle(R.style.PopupAnimation2);
    }

    protected BasePopupWindow()
    {

    }

    public abstract View setPopview();
}
(3)R.layout.popup_bottom_custom

“取消”栏样式

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:id="@+id/rl_popup"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/half_transparent"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        android:background="@drawable/rnd_corner"
        >
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >

        <LinearLayout
            android:id="@+id/ll_root"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="vertical">

        </LinearLayout>

    </ScrollView>

        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/dk_dp_5"
            android:background="#f2f2f2"
            />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="10dp"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:gravity="center">

        <TextView
            android:id="@+id/tv_cancel"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="取消"
            android:textColor="@color/black"
            android:textSize="18dp"/>

    </LinearLayout>

    </LinearLayout>

</RelativeLayout>

(4)R.layout.item_pop

单个选择项样式,本文例子每个选项只展示一个TextView,整体可滑动

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <TextView
                android:id="@+id/tv_button"
                android:layout_width="match_parent"
                android:layout_height="45dp"
                android:layout_gravity="center"
                android:gravity="center"
                android:textColor="@color/black"
                android:textSize="18dp"
                tools:text="按钮1"/>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="#eeeeee"/>


        </LinearLayout>


    </ScrollView>


</LinearLayout>

2、调用

(1)Activity类
public class PublishToShangguanActivity extends BaseActivity implements CustomPopListener {

    //是否原创选择模块
    @InjectView(id = R.id.ly_is_original,click = true)
    private LinearLayout mLyOriginal;

    //选择是否原创弹窗
    CustomBottomPop originalSelectPop;
    protected List<PopBean> originalLists = new ArrayList<>();
    String[] originals = new String[]{"是","否"};

    @Override
    public void onPreInject() {
        Utils.fitSystemWhite(this);
        setContentView(R.layout.activity_publish_to_shangguan);
    }

    @Override
    protected void onPostCreate() {
    }


    //重点关注监听这里,其余根据业务可变
    @Override
    public void onClick(View v) {
        if (v == mLyOriginal){
            //调出选择是否原创弹窗
            originalLists.clear();
            for (int i = 0;i < originals.length;i++){
                originalLists.add(new PopBean(i,originals[i]));
            }
            originalSelectPop = new CustomBottomPop(this, originalLists, this);
            originalSelectPop.setClippingEnabled(true);
            originalSelectPop.showAtLocation(getRootView(), Gravity.CENTER, 0, 0);
        }
    }

    //弹窗选择监听,可取出选择项的值
    @Override
    public void onClickButton(CustomBottomPop customBottomPop, PopBean bean) {
       if (customBottomPop == originalSelectPop){
            mTvOriginal.setText(bean.getValue());
        }
        customBottomPop.dismiss();
    }
}
(2)自定义监听类 CustomPopListener.java
package com.custom.jfrb.ui.first.base;

import com.custom.jfrb.ui.first.bean.PopBean;
import com.custom.jfrb.ui.first.customView.CustomBottomPop;

/**
 * Created by Administrator on 2018/3/1 0001.
 */

public interface CustomPopListener{
    void onClickButton(CustomBottomPop customBottomPop, PopBean bean);
}

3、完成、Nice!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1116975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聚观早报 | 遥感AI大模型发布;拼多多启动11.11大促

【聚观365】10月21日消息 遥感AI大模型发布 拼多多启动11.11大促 OPPO Find N3开启预售 魅族20 Classic开启预定 埃安昊铂HT开启预售 遥感AI大模型发布 阿里达摩院发布业内首个遥感AI大模型&#xff0c;一个模型即可识别农田、农作物、建筑等地表万物&#xff0c;让AI进一…

【2023淘宝双十一活动什么时间开始?天猫双十一2023具体时间安排

2023双十一活动什么时间开始&#xff1f;让我们先来了解一下双十一的优惠活动以及玩法吧。请收藏这份2023年淘宝天猫双十一玩法优惠攻略&#xff0c;让你轻松购得心仪的商品&#xff01; 红包派送 活动期间&#xff0c;每天都可以领取超级红包&#xff01;请注意&#xff0c…

【JavaEE重点知识归纳】第8节:面向对象程序三大特性:封装、继承、多态

目录 一&#xff1a;封装 1.封装的概念 2.访问限定符 3.封装扩展包 二&#xff1a;继承 1.概念 2.语法 3.父类成员的访问 4.super关键字 5.子类构造方法 6.super和this 7.继承方式 8.final关键字 9.继承和组合 三&#xff1a;多态 1.概念 2.实现条件 3.重写 …

【supervisor】 问题处理 unix:///var/run/supervisor/supervisor.sock no such file

问题描述 最近笔者在配置 supervisor&#xff0c;希望用 supervisor 进行进程服务管理的时候遇到了一些问题&#xff0c;具体是&#xff1a; 运行 supervisorctl status 的时候遇到了 unix:///var/run/supervisor/supervisor.sock no such file 的问题。在运行 sudo service …

MySQL日志 错误日志 二进制日志 查询日志 慢查询日志

一、错误日志 错误日志是MySQL中最重要的日志之一,它记录了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的&#xff0c;默认存放目录/var/log/,默认的日志文件名…

了解多媒体展厅弧幕投影系统收费构成,轻松制定预算

随着数字多媒体技术在内容展示行业中的广泛应用&#xff0c;基于投影、LED等技术手段的多媒体互动装置呈现多样化发展趋势&#xff0c;越来越多的新颖模式出现在大众眼前&#xff0c;其中就包括了备受关注的弧幕投影系统&#xff0c;作为投影技术显示形式的一种&#xff0c;它打…

抖音招聘直播报白有成本低和招聘效果精准的优势

抖音的短视频流量能够让岗位信息覆盖更广泛的人群&#xff0c;增加招聘信息的曝光度。通过抖音的短视频流量红利和精准推送&#xff0c;能够提高岗位信息的曝光度和求职者的留存率。如果你想做招聘报白却不知道怎么处理&#xff0c;可以咨询我。 创意创新:抖音招聘注重创意和创…

遍历完全二叉树节点

完全二叉树的节点个数 递归普通二叉树遍历解法 我们先来普及一下完全二叉树的概念&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层…

C语言之排序

1.冒泡排序 冒泡排序就不多说了&#xff0c;只需要两层循环嵌套&#xff0c;两两比较确定相对正确的顺序即可。 2.插入排序 插入排序的思想就是每一次向后寻找一个再将其与前面有序的部分进行对比&#xff0c;寻找合适位置插入。 这里关键要避免让前移超出目前读取的数字&…

Java版ORM最初雏形

经过一个晚上的加班&#xff0c;终于把ORM初步结构工程搭好了。工程依赖有点难用&#xff0c;编辑器提示比VS差很多。 首先LIS.Core创建一个最初的容器雏形&#xff0c;先能反射得到对象给ORM获得数据库驱动 然后ORM创建数据库驱动差异接口&#xff0c;不同数据库实现接口后配…

MATLAB中 tf2zpk函数用法

目录 语法 说明 示例 IIR滤波器的极点、零点和增益 tf2zpk函数的功能是将传递函数滤波器参数转换为零极点增益形式。 语法 [z,p,k] tf2zpk(b,a) 说明 [z, p, k] tf2zpk(b, a) 从传递函数参数 b 和 a 中找到零点矩阵 z&#xff0c;极点向量 p&#xff0c;以及相关的增益…

岗亭一键报警器设计

岗亭一键报警器设计 岗亭一键报警器设计人性化&#xff0c;拥有多种功能&#xff0c;例如&#xff1a; 紧急报警&#xff1a;遇到紧急情况时&#xff0c;只需按下报警器按钮&#xff0c;即可迅速向监控中心发送报警信号&#xff0c;以便相关人员及时采取应对措施。远程监控&am…

NLP:从头开始的文本矢量化方法

一、说明 NLP 项目使用文本&#xff0c;但机器学习算法不能使用文本&#xff0c;除非将其转换为数字表示。这种表示通常称为向量&#xff0c;它可以应用于文本的任何合理单位&#xff1a;单个标记、n-gram、句子、段落&#xff0c;甚至整个文档。 在整个语料库的统计 NLP 中&am…

EPLAN_007#3D图形的导入、编辑和定义

一定要打开对象捕捉&#xff0c;否则会严重偏移&#xff01;&#xff01;&#xff01; 一、导入3D模型&#xff0c;合并模型 1、新建一个宏项目 2、导入&#xff08;3D图形&#xff09; 可以对目标进行旋转查看 3、合并图形&#xff08;不建议合并&#xff09; 框选目标 点合并…

用python写一个贪吃蛇的程序能运行能用键盘控制

用python写一个贪吃蛇的程序能运行能用键盘控制 1.源码2.运行效果 1.源码 开发库使用&#xff1a;pygame random 直接在终端运行&#xff1a;pip install pygame pycharm安装库&#xff1a;文件-设置-项目-Python 解释器 import pygame import random# 初始化pygame pygame…

代码随想录算法训练营第五十九天 | 647. 回文子串、516.最长回文子序列

647. 回文子串 链接&#xff1a; 代码随想录 &#xff08;1&#xff09;代码 516.最长回文子序列 链接&#xff1a; 代码随想录 &#xff08;1&#xff09;代码

文件上传漏洞靶场前十关

pass1&#xff1a; 只能上传照片 用burp抓包改一下数据包试试&#xff1a; 上传成功 菜刀getshell Pass2&#xff1a; 寄 Png可以&#xff0c;抓包&#xff1a; 跟pass1一样阿 Pass3&#xff1a; 又寄 这里用抓包改数据包&#xff0c;发现仍然不可以 说明后端还有对文件名后缀…

springboot中@scheduled的使用

1.主要实现类ScheduledAnnotationBeanPostProcessor 在postProcessAfterInitialization(Object bean,String beanName)方法中找到所有bean中有注解为Scheduled的方法&#xff0c;组装成task,添加到调度线程池中 2.Task先按线程池接口类型TaskScheduler去容器中寻找taskSchedu…

freeipa server副本同步中断,两主节点数据不一致

/var/log/messages 和/var/log/dirsrv/slapd-testhadoop-COM 日志都出现以下日志: If replication stops, the consumer may need to be reinitialized. [27/Jun/2023:05:15:09.469361922 0800] - ERR - NSMMReplicationPlugin - changelog program - repl_plugin_name_cl - a…

【vue+nestjs】qq第三方授权登录【超详细】

项目场景&#xff1a; 前端使用vue3ts 后端使用nestjs 1.申请appId,appKey 1.进入qq互联官网。创建应用 特别注意 在填写网站回调域时,需要你线上真实能访问的。不然审核不通过。我的回调地址是前端路由地址 2.代码演示 特别注意: 如果你跟我一样是前后端分离的模式开发的…