Android 自定义控件+下拉选择框实现

2023-11-07

自定义控件+下拉选择框实现

当系统自带的控件不能满足我们的需求,而我们又会经常使用到,这个时候我们就可以自定义控件。下拉框是我们在做项目中经常会需要用到的。

上图就是一个自定义的控件在这里插入图片描述
点击显示下拉框进行选择:在这里插入图片描述

pop_view.xml:
(自定义控件界面)

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

        <TextView
            android:id="@+id/pop_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:layout_marginLeft="15dp"
            android:paddingTop="26dp"
            android:paddingBottom="10dp"
            android:textColor="#000000" />
        <RelativeLayout
            android:id="@+id/pop_rl"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView
                android:id="@+id/pop_choose"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:hint="请选择"
                android:textColor="#FF888888"
                android:paddingTop="26dp"
                android:paddingBottom="10dp"
                android:paddingRight="25dp"
                android:layout_toLeftOf="@+id/pop_img"
                android:textSize="16sp" />

            <ImageView
                android:id="@+id/pop_img"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:tint="#FFC7C7CC"
                android:src="@drawable/choose"
                android:layout_marginRight="15dp"
                android:layout_alignParentRight="true"
                android:paddingTop="26dp"
                android:paddingBottom="10dp"
                android:layout_centerVertical="true" />
        </RelativeLayout>
    </LinearLayout>

activity_main.xml:
(在布局中应用改控件)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    tools:context=".MainActivity">

   <com.example.text.PopLayout
       android:id="@+id/pop_layout"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"/>

</LinearLayout>

PopLayout.java

package com.example.text;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class PopLayout extends LinearLayout {
    //自定义控件
    private TextView popText;
    private TextView popChoose;
    private ImageView popImg;
    private RelativeLayout popRl;

	//重写LinearLayout带有两个参数的构造函数
    public PopLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.pop_view, this);
        popText = findViewById(R.id.pop_text);
        popChoose = findViewById(R.id.pop_choose);
        popImg = findViewById(R.id.pop_img);
        popRl = findViewById(R.id.pop_rl);
    }


    public TextView getPopText() {
        return popText;
    }

    public TextView getPopChoose() {
        return popChoose;
    }

    public ImageView getPopImg() {
        return popImg;
    }

    public RelativeLayout getPopRl() {
        return popRl;
    }

}

choose_window.xml
(自定义下拉框布局)

<?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="wrap_content"
    android:background="#ffffff"
    android:orientation="vertical">

    <ListView
        android:id="@+id/spinner_lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:cacheColorHint="#00000000"
        android:dividerHeight="1px"
        android:divider="#DDDDDD"
        android:layout_marginRight="10dp"
        android:layout_marginLeft="10dp"
        android:scrollbars="none"/>

</LinearLayout>

choose_item.xml
(自定义下拉框布局中listview的子布局)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:minHeight="40dp">


    <TextView
        android:id="@+id/cup_text"
        android:paddingLeft="15dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#000000"
        android:textSize="15sp" />

</LinearLayout>

ChooseAdapter.java

package com.example.text;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;

public class ChooseAdapter extends BaseAdapter {

    //popwindow中listview的适配器
    private List<String> mList;
    private LayoutInflater mInflater;

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

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

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

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        ViewHolder viewHolder;

        if (view == null) {
            view = mInflater.inflate(R.layout.choose_item, null);
            viewHolder = new ViewHolder();
            viewHolder.text = view.findViewById(R.id.cup_text);
            view.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) view.getTag();
        }

        viewHolder.text.setText(mList.get(position));

        return view;
    }

    public static class ViewHolder {
        public TextView text;
    }

    public ChooseAdapter(Context context,List<String> mList){
        this.mList = mList;
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//  取得xml里定义的view
    }


    public void refreshData(List<String> objects, int index) {
        mList = objects;
        if (index < 0) {
            index = 0;
        }
        if (index >= mList.size()) {
            index = mList.size() - 1;
        }
    }

    //listview点击事件
    public static interface IOnItemSelectListener {
        public void onItemClick(int pos);
    }

}

ChoosePopwindow.java

package com.example.text;

import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.PopupWindow;

import java.util.List;

public class ChoosePopwindow extends PopupWindow implements AdapterView.OnItemClickListener {

    private Context mContext;
    private ListView mListView;
    private ChooseAdapter mAdapter;
    private ChooseAdapter.IOnItemSelectListener mItemSelectListener;

    public ChoosePopwindow(Context context) {
        super(context);
        mContext = context;
        init();
    }

    private void init() {
        View view = LayoutInflater.from(mContext).inflate(R.layout.choose_window, null);
        setContentView(view);
        setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
        setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);

        setFocusable(true);
        ColorDrawable dw = new ColorDrawable(0x00);
        setBackgroundDrawable(dw);


        mListView = (ListView) view.findViewById(R.id.spinner_lv);
        mListView.setOnItemClickListener(this);
    }

    public void refreshData(List<String> list, int selIndex) {
        if (list != null && selIndex != -1) {
            if (mAdapter != null) {
                mAdapter.refreshData(list, selIndex);
            }
        }
    }
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        dismiss();
        if (mItemSelectListener != null) {
            mItemSelectListener.onItemClick(position);
        }
    }

    public void setItemListener(ChooseAdapter.IOnItemSelectListener listener) {
        mItemSelectListener = listener;
    }

    public void setAdapter(ChooseAdapter adapter) {
        mAdapter = adapter;
        mListView.setAdapter(mAdapter);
    }
}

PopTool.java
(自定义控件的功能,即下拉框的实现)

package com.example.text;

import android.content.Context;
import android.content.res.Resources;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class PopTool implements ChooseAdapter.IOnItemSelectListener{

    private TextView text1;
    private TextView text2;//显示在这个TextView下面
    private RelativeLayout relativeLayout;//点击此layout显示popwindow
    private ImageView image;

    private ChoosePopwindow choosePopwindow;
    private ChooseAdapter mAdapter;

    private List<String> mListType = new ArrayList<String>();

    public PopTool(RelativeLayout relativeLayout, TextView text1, TextView text2, ImageView image, List<String> mListType, final Context context){
        this.relativeLayout =relativeLayout;
        this.image = image;
        this.mListType = mListType;
        this.text1 = text1;
        this.text2 = text2;
        init(context);
        relativeLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showSpinWindow(context);
            }
        });
    }

    public void init(final Context context){
        mAdapter = new ChooseAdapter(context, mListType);
        mAdapter.refreshData(mListType, 0);
        choosePopwindow = new ChoosePopwindow(context);
        choosePopwindow.setAdapter(mAdapter);
        choosePopwindow.setItemListener(this);

    }

    //设置PopWindow
    public void showSpinWindow(Context context) {

        Resources resources = context.getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        float density1 = dm.density;
        int width = dm.widthPixels;
        //设置popwindow大小
        choosePopwindow.setWidth(width / 2);
        //设置显示的位置在哪个控件的下方
        choosePopwindow.showAsDropDown(text2);

    }

    @Override
    public void onItemClick(int pos) {
        //将选中的内容显示在指定控件中
        String value = mListType.get(pos);
        text2.setText(value);
    }
}

MainActivity.java

package com.example.text;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private PopLayout mPopLayout;
    private PopTool mPopTool;
    private TextView text1;
    private TextView text2;
    private ImageView image;
    private RelativeLayout relativeLayout;
    private List<String> mList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initList();
        init();
        text1.setText("单元:");

    }

    private void initList() {
        mList.add("一单元");
        mList.add("二单元");
        mList.add("三单元");
        mList.add("四单元");
    }

    private void init(){
        mPopLayout = findViewById(R.id.pop_layout);
        text1 = mPopLayout.getPopText();
        text2 = mPopLayout.getPopChoose();
        image = mPopLayout.getPopImg();
        relativeLayout = mPopLayout.getPopRl();
        mPopTool = new PopTool(relativeLayout,text1,text2,image,mList,this);
    }
    
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 自定义控件+下拉选择框实现 的相关文章

  • 画流程图都可以用哪些工具?

    在日常生活中 我相信我们很多人都看到过流程图 对于设计师来说 它还需要涉及流程图来反映用户的旅程和交互方式 那么你知道哪些流行的流程图设计软件呢 作为高级设计师 我今天推荐10款流程图设计软件 你可以和我一起读这篇文章 即时设计 即时设计是
  • uni-app 从零开始第三章:底部 tabBar

    pages json 页面路由 uni app官网 一 新建 home页面 找到pages目录 新增一个home的页面 勾选上同时新建文件夹 新建完成后 pages json 中 会自动添加上刚刚新建的文件信息 二 新增tabBar数据 在
  • Seaborn做图系列①——直方图&箱型图&散点图&变量关系图&回归图&热力图&条形图

    数据可视化系列汇总 Matplotlib可视化 二维图表绘制 折线图 直方图 散点图 条形图 箱形图 Matplotlib可视化 3D绘制散点图 曲面图 折线图 等高线图 Excel数据分析高级技巧 动态图表制作 offset vlooku
  • 26_Java判断String是否以某个字符串开头或结尾

    Java判断String是否以某个字符串开头 String mobile 8618730600000 System out println mobile startsWith 86 输出true System out println mob
  • VSCode+PHPstudy配置PHP开发环境

    第一步 下载安装VSCode编辑器 第二步 下载安装PHPstudy集成环境 第三步 打开PHPstudy 选择界面左侧中的环境 第四步 点击右侧PHP运行环境下面的更多 选择适合的PHP版本 第五步 点击PHPstudy左侧环境 再点击右
  • 基于 Docker 来安装 FastDFS

    文章目录 百度百科 FastDFS 简介 FastDFS 存储策略 上传交互过程 下载交互过程 FastDFS的文件同步 FastDFS 为什么要结合 Nginx 其他资源 FastDFS 安装 环境准备 创建工作目录 docker com
  • Qt 自定义颜色下拉控件

    效果 其实 在这里之前看了许多自定义颜色控件 有的是采用继承QPushButton 点击后 直接弹出 QColorDialog 然后重写 paintEvent 函数 绘制背景为选中的颜色 但是 没有下拉选择颜色的感觉 也有的继承 QComb
  • 微信小程序实战之实现富文本编辑器

    前言 这是我参加掘金启航计划的第三篇文章 这次总结的是实现一个简单的富文本编辑器 相信阅读文章后 观众老爷们 能够实现富文本编辑器 在微信小程序中发布自己的文章 希望观众老爷们多多支持 1 实现效果 实现的效果如下图 1 文本加粗 斜体 下
  • AIX 6.1环境 yum的安装方法

    smit使用方法介绍 因为后面会用到 所以先介绍一下smit的使用方法 输入smitty installp或smitty install 选择Install and Update Software 选择Install Software 在I
  • java打印日志时,如何对字段进行脱敏?

    在我们开发项目的时候 有些字段比较敏感 比如用户信息 这就需要在打印日志的时候对相关字段脱敏处理 本文提供的脱敏方案是使用conversionRule标签的方式 通过继承MessageConverter 在打印日志的时候对相关字段进行脱敏
  • 【RNA-seq】表达矩阵的归一化处理(RPKM,TPM,FPKM,RPM(CPM))

    在RNA seq上游的流程中 所得到的产物为表达矩阵 一般指通过RSEM HTseq等量化工具统计得到的 各个样本比对到参考基因组中各个基因的reads数 一般成为raw read count 这也是最简单的表达定量形式 但是在分析不同样本
  • Linux实现查看文件内容的多种方式

    目录 1 more 分屏显示文件内容 2 less 文本内容查看器 3 head n 显示文件前n行到终端 4 tail n 显示文件后n行到终端 5 实现实时查看文件内容 追踪文件 除了使用vi vim 编辑器查看文件内容和使用cat命令
  • python + selenium 爬淘宝登录

    淘宝的反爬虫机制如果更强大那么该文章方法也没用了 记录于2023 08 07 from selenium import webdriver from selenium webdriver common by import By from s
  • react路由动画跳转,猛练自然强

    react路由动画跳转 1 先在react项目中下载一个css第三方库 用npm或者yarn 第三方库下载 npm install animate css save yarn add animate css 2 在react组件中引用这个c
  • chatgpt赋能python:Python开发的SEO应用

    Python开发的SEO应用 搜索引擎优化 SEO 已经成为每个网站所有者需要考虑的重要因素之一 随着搜索引擎算法的不断变化和演进 我们需要确保我们的网站能在各种搜索引擎中进行良好的排名 Python作为一门强大的编程语言 已经被广泛用于S
  • linux centos 7 恶搞不停重启以及问题解决

    centos 7 恶搞不停重启以及问题解决 一 基础知识 1 运行级别的介绍 首先 CentOS系统有7个运行级别 runlevel 如下 运行级别0 系统停机状态 系统默认运行级别不能设为0 否则不能正常启动 运行级别1 单用户工作状态
  • ADB 用法大全

    基本用法 命令语法 adb 命令的基本语法如下 adb d e s
  • Java时间操作定义类

    类描述 时间操作定义类 public class DateUtils extends PropertyEditorSupport 各种时间格式 public static final SimpleDateFormat date sdf ne
  • libvirt安装过程

    libvirt安装过程 下载libvirt 0 8 1 tar gz 解压该文件 tar zxvf libvirt 0 8 1 tar gz 解压完成后进入到文件夹 libvirt 0 8 1开始安装 1 configure 2 此时提示缺
  • 笔记本电脑无法连接网络并在网络状态中显示ipv4和ipv6无网络访问权限

    win10电脑连不上网首先先右键无线或者网线那个图标 然后点击打开网络和共享中心 找到并点击连接 进入以太网或者wifi状态 看ipv4连接后面是否显示的是无网络访问权限 如果是 请按以下步骤操作 在桌面按WIN R输入CMD点击确定 打开

随机推荐

  • Docker部署Canal

    Canal Canal是阿里开源的一款基于Mysql数据库binlog的增量订阅和消费组件 通过它可以订阅数据库的binlog日志 然后进行一些数据消费 如数据镜像 数据异构 数据索引 缓存更新等 相对于消息队列 通过这种机制可以实现数据的
  • Windows10+CUDA+Tensorflow-gpu安装。装了一个星期,啥问题都见过了。(eg: ImportError: DLL load failed)

    目录 1 CUDA 卸载 2 中间出现的问题 2 1 问题1 This graphics driver could not find compatible graphics hardware You may continue install
  • 畸形报文单包攻击检测防御原理

    Ping of Death攻击 路由器对包的大小是有限制的 IP报文的长度字段为16位 即IP报文的最大长度为65535 如果遇到大小超过65535的报文 会出现内存分配错误 从而使接收方的计算机系统崩溃 攻击者只需不断的通过Ping命令向
  • 源代码中有什么

    在过去 源代码是核心机密 优秀的软件工程师在在某个公司的黑屋子里写程序 我们只能看到发布的产品 但是在今天 开放源代码成为一种开发方式 高手们在开源社区发布他们的代码 我们也终于有机会一睹大师高手们的源程序了 我们可以很容易地从网上下载到各
  • Kubeflow Pipeline - 构建自定义的 Workflow

    文章目录 1 Overview 2 Steps 2 1 理解 component 和 pipeline 2 2 Python SDK 构建 component 和 pipeline 2 3 上传 pipeline 3 Summary 1 O
  • 亮度、对比度与饱和度

    亮度是指图片的明暗程度 对比度是指图片明暗的差异 饱和度则是图片颜色的饱满程度 图片文件一般是RGB格式 当然也有的是YCBR格式 前者主要用于显示 后者则主要用于印刷 当然世上没有绝对的事情 也有人喜欢在电脑或手机上看YCBR格式的 至于
  • 消息队列-msgget

    msgget 获取系统V消息队列标识符 获取消息队列的id 头文件 include
  • 动态规划——JavaScript

    目录 什么是动态规划 怎么用动态规划 动态规划经典例题 斐波那契数 题目描述 思路 代码 爬楼梯 题目描述 思路 代码 不同路径 题目描述 思路 例题 不同路径 打家劫舍 打家劫舍 买卖股票的最佳时期 买卖股票的最佳时期 使用最小花费爬楼梯
  • 【STM32】keil环境下移植cJSON

    前言 由于工作需要 需要在STM32上使用Json 所以把一个JSON库移植到了STM32 keil MDK 实际上keil已经有了JSON扩展包 Jansson 只需要从keil官网上下载JSON Pack再导入就行 有兴趣的可以看这篇文
  • SQLi Labs Lesson22

    Lesson 22 Cookie Injection base64 encoded Double quotes 用admin账号登陆后 查看cookie 发现cookie为 YWRtaW4 有了上一节的经验 admin的base64编码为
  • 接口型模式之Bridge(桥接)模式

    1 如果你期望将实现与抽象相分离以便二者独立演化 可使用Bridge 桥接 模式 2 举例 抽象平台 public abstract class ImpLog public abstract void execute String msg
  • google v8 编译 运行遇到的问题

    环境 window os window sdk 10 vs2017 方法 官网提供的方法 https github com v8 v8 wiki Building from Source 问题1 cmd中执行命令时 tools dev v8
  • mysql_pycharm连接虚拟机上的mysql

    虚拟机上的系统是ubuntu 16 04 LTS 关于虚拟机安装mysql 5 7 参考以下的连接 Ubuntu安装Mysql 5 7 安装成功之后 执行赋予局域网可以访问虚拟机上的mysql mysql gt GRANT ALL PRIV
  • 网站工作原理,你搞懂了吗?

    网站工作原理 你搞懂了吗 网站工作原理 输入网站地址 按下回车会发生啥 1 DNS解析 2 TCP连接 2 1 TCP介绍 3 发送HTTP请求 3 1 HTTPS协议 3 2 HTTPS过程 3 3 HTTP请求 4 服务器处理请求并返回
  • 用户多设备多账户同时在线场景、匿名用户行为同步到注册用户

    TOC随着移动设备的普及和社交媒体的发展 用户在多个设备上同时访问同一个应用成为了一种常见的现象 这些设备可能属于同一个用户 也可能属于不同的用户 而且有些用户可能没有注册账户 只是以匿名的方式访问应用 在这种多设备 多账户 匿名用户同时在
  • vue动态合并行

    这个 处理数据 将表格数组传入 在获取到数组时调用 getSpanArr data this spanArr for var i 0 i lt data length i if i 0 this spanArr push 1 空数组 用来记
  • Linux下生成patch和打patch

    通过diff工具生成补丁 patch工具打上补丁 在使用diff之前 你需要保留一份未修改过的源码 然后在其它地方修改源码的一份拷贝 diff对比这两份源码生成patch 修改过的源码必须保留原来的文件名 例如 如果你修改源码中的a c文件
  • chinesecalendar 模块判断节假日

    chinesecalendar是python 中判断date类型的日期是工作日 还是节假日 比较准确地模块 先安装该模块 pip install chinesecalendar 导入模块的用法如下 import datetime from
  • PowerShell 基本知识

    常见的 powershell 攻击工具 PowerSploit powershell 后期漏洞利用框架 常用于信息探测 特权提升 凭证窃取 持久化等操作 Nishang 基于 PowerShell 的渗透测试专用工具 集成了框架 脚本和各种
  • Android 自定义控件+下拉选择框实现

    自定义控件 下拉选择框实现 当系统自带的控件不能满足我们的需求 而我们又会经常使用到 这个时候我们就可以自定义控件 下拉框是我们在做项目中经常会需要用到的 上图就是一个自定义的控件 点击显示下拉框进行选择 pop view xml 自定义控