废话
众所周知,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
}
}