带弹出列表的EditText
最近做的一個(gè)Andriod里有一個(gè)這個(gè)要求,一個(gè)東西需要輸入,但同時(shí)可以在列表直接選擇。看到這個(gè)需求,瞬間想到了QQ的登錄界面,那個(gè)賬號(hào)輸入的控件正式我所需要的。
這個(gè)賬號(hào)輸入框右邊有一個(gè)按鈕,點(diǎn)擊可以顯示一個(gè)下拉列表。
怎么實(shí)現(xiàn)呢這個(gè)呢,我知道Android里面有一個(gè)Spinner,就是下拉列表,但是Spinner沒(méi)有輸入框。如果能把EditText和Spinner合到一起來(lái),恰恰就是我需要的功能。
Google了一陣之后我發(fā)現(xiàn)這種需求確實(shí)不少,但是最后好多解決方法是使用AutoCompleteTextView。這是一個(gè)支持自動(dòng)補(bǔ)全的輸入框,輸入的同時(shí)會(huì)顯示一個(gè)匹配當(dāng)前輸入做前綴的列表。作為一個(gè)半路出家的Android程序員,當(dāng)時(shí)確實(shí)眼前一亮(-_-||)。但是這個(gè)AutoCompleteTextView有一個(gè)缺點(diǎn),就是要有輸入才會(huì)有提示列表,可以重載它使得不輸入也彈出提示列表,后面會(huì)把代碼貼出來(lái)。雖然和需求有一些出入,但是當(dāng)時(shí)沒(méi)有找到更好的解決方法就這么用了。重載后的代碼如下:
package com.maoguangming.test.util; import android.content.Context;import android.graphics.Rect;import android.util.AttributeSet;import android.view.KeyEvent;import android.widget.AutoCompleteTextView; public class InstantAutoCompleteTextView extends AutoCompleteTextView { public InstantAutoCompleteTextView(Context context) {super(context); } public InstantAutoCompleteTextView(Context context, AttributeSet attrs) {super(context, attrs); } public InstantAutoCompleteTextView(Context context, AttributeSet attrs,int defStyle) {super(context, attrs, defStyle); } @Override public boolean enoughToFilter() {return true; } @Override protected void onFocusChanged(boolean focused, int direction,Rect previouslyFocusedRect) {super.onFocusChanged(focused, direction, previouslyFocusedRect);if (focused && getAdapter() != null) {performFiltering(getText(), KeyEvent.KEYCODE_UNKNOWN); } } }?
在使用了一段時(shí)間之后我發(fā)現(xiàn)這個(gè)AutoCompleteTextView之后,我發(fā)現(xiàn)在我這個(gè)場(chǎng)景下體驗(yàn)不是很好,尤其是程序橫屏的時(shí)候,輸入框在輸入時(shí)會(huì)默認(rèn)全屏,這個(gè)時(shí)候就看不到提示列表了,可以調(diào)整參數(shù)使得輸入法不全屏,但是半屏顯示輸入法,一來(lái)列表顯示的地方不大,二來(lái)和其他的輸入框風(fēng)格不一。另外列表是經(jīng)過(guò)篩選過(guò)的,如果在輸入過(guò)程中想直接選擇列表中的值,選擇范圍只有一部分。種種原因,最終我決定重新開(kāi)始找解決方案。
由于將Spinner和EditText結(jié)合以來(lái)上次都找過(guò),我決定先在EditText右邊添加一個(gè)類(lèi)似QQ賬號(hào)輸入框的小箭頭。果然在Stack Overflow上找到了很多解決方案,最終我用的方法是直接在layout里設(shè)置EditText的drawableRight。
PrFont34Bin0BinSub0Frac0Def1Margin0Margin0Jc1Indent1440Lim0Lim1<EditTextandroid:id="@+id/editText1"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="3"android:ems="10"android:drawableRight="@drawable/unfold">?
?
android:drawableRight="@android:drawable/arrow_down_float"
Android系統(tǒng) 圖標(biāo) arrow_down_float? 向下的箭頭
?
效果不錯(cuò)。那個(gè)小箭頭盜用了Android 4.0.3系統(tǒng)庫(kù)的資源文件(numberpicker_down_normal_holo_light.png)。現(xiàn)在關(guān)鍵是處理點(diǎn)擊事件并且彈出一個(gè)列表。
關(guān)于點(diǎn)擊事件,另一個(gè)帖子里有一個(gè)很巧妙又很簡(jiǎn)單的方法,就是設(shè)置EditText的OnTouchListener,在點(diǎn)擊到右邊的圖標(biāo)的范圍時(shí)做相應(yīng)的操作:
etTest.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) {final int DRAWABLE_LEFT = 0;final int DRAWABLE_TOP = 1;final int DRAWABLE_RIGHT = 2;final int DRAWABLE_BOTTOM = 3; // Check if touch point is in the area of the right buttonif(event.getAction() == MotionEvent.ACTION_UP) {if(event.getX() >= (etTest.getWidth() - etTest.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {// your action herereturn true; } } return false; } });?
最后一步就是顯示列表了,不買(mǎi)關(guān)子了,最后使用了ListPopupWindow
String[] list = { "item1", "item2", "item3", "item4" };lpw = new ListPopupWindow(this);lpw.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, list));lpw.setAnchorView(etTest);lpw.setModal(true);?
聯(lián)合上上面點(diǎn)擊按鈕的監(jiān)聽(tīng)時(shí)間,功能就完成了,代碼如下:
package com.maoguangming.test; import android.app.Activity;import android.os.Bundle;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAdapter;import android.widget.EditText;import android.widget.ListPopupWindow; public class MainActivity extends Activity implements OnTouchListener,OnItemClickListener { private EditText etTest;private ListPopupWindow lpw;private String[] list; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); etTest = (EditText) findViewById(R.id.et_test);etTest.setOnTouchListener(this); list = new String[] { "item1", "item2", "item3", "item4" };lpw = new ListPopupWindow(this);lpw.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, list));lpw.setAnchorView(etTest);lpw.setModal(true);lpw.setOnItemClickListener(this); } @Override public void onItemClick(AdapterView<?> parent, View view, int position,long id) {String item = list[position];etTest.setText(item);lpw.dismiss(); } @Override public boolean onTouch(View v, MotionEvent event) {final int DRAWABLE_RIGHT = 2; if (event.getAction() == MotionEvent.ACTION_UP) {if (event.getX() >= (v.getWidth() - ((EditText) v) .getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {lpw.show();return true; } } return false; } }效果如圖
轉(zhuǎn)載 http://maoguangming.com/blog/edittext-with-popuplist.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/z_lb/p/3955710.html
總結(jié)
以上是生活随笔為你收集整理的带弹出列表的EditText的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 获取最近一周
- 下一篇: bfs理解——hdu6386好题