Android 实现一个下拉选择+输入框的结合体

废话

众所周知,EditText支持输入但是不支持下拉选择,而Spinner支持下拉选择但是不支持输入。有人就说了,把这俩结合一下不就好了吗,很简单的事嘛。这个我试了一下,怎么说呢,可以是可以的,但是Spinner他这个样式就比较难以处理了,需要自定义修改,因为我就只需要一个下拉选择和一个下拉图标,至于选择的内容直接显示在EditText就行,遂放弃。然后我就在C某N搜了一下大佬们的文章,果不其然第一篇就有解决方案,但是只显示了前面一些篇幅,接下去要冲VIP才能免费观赏,这能冲吗,这当然不能,谁不知道我是豹子头零充。不过万幸的是前面的一些篇幅写了大佬的整体思路,大致是这样:通过一个EditText和一个ImageView的组合来实现控件,然后采用popupWindow进行界面弹出。不愧是大佬,就是聪明。不好意思,这次废话好像又写多了,下面正文开始。

一、实现UI

activity_main.xml创建一个EditText和ImageView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="40dp"
    android:layout_margin="10dp"
    android:orientation="horizontal">
        <EditText
            android:id="@+id/edit_text"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="2"
            android:background="@drawable/border"/>
        <ImageView
            android:id="@+id/image_view"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:padding="5dp"
            android:src="@drawable/dropdown"
            android:background="@drawable/border"/>
</LinearLayout>

注意:android:src="@drawable/dropdown"这是引入的下拉图片,在阿里图标库找的

android:background="@drawable/border"这是给这俩个组件加上边框,这样看着好看些

这是border.xml的边框代码

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <solid android:color= "#FFFFFF"/>
    <stroke android:width="2dp" android:color="#000000"/>
    <padding
        android:top="5dp"
        android:bottom="5dp"
        android:left="10dp"
        android:right="10dp" />
</shape>

二、实现逻辑

MainActivity.java代码量比较少,输入框不管他,能够输入就行,对下拉图片进行监控,点击就弹出下拉菜单并且将选中内容显示在输入框就行。

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListPopupWindow;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity{

    private EditText edit_text;
    private ImageView image_view;
    private final String[] data = {"1", "2", "3","4","5"};//填充数据
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        edit_text =  findViewById(R.id.edit_text);
        image_view = findViewById(R.id.image_view);
        image_view.setOnClickListener(v -> showMenu());
    }

    private void showMenu() {
        // 创建并配置ListPopupWindow
        ListPopupWindow listPopupWindow = new ListPopupWindow(this);
        listPopupWindow.setAdapter(new ArrayAdapter<>(this,android.R.layout.simple_list_item_1, data));
        listPopupWindow.setAnchorView(edit_text);// 定位基准控件
        listPopupWindow.setModal(true);// 设置为模态,防止其他UI交互
        // 处理列表项点击事件
        listPopupWindow.setOnItemClickListener((adapterView, view, position, id) -> {
            edit_text.setText(data[position]);// 更新EditText内容
            listPopupWindow.dismiss();// 隐藏popup
        });
        listPopupWindow.show();// 显示popup
    }

}

三、实际效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿柒爱吃鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值