ListView中含有EditText时候--要命的焦点问题迎刃而解
?
當一個ListView的item中含有搶占焦點的控件的時候,我們通常在item的布局中加上這樣一句:?
android:descendantFocusability=”blocksDescendants”?
防止搶占焦點,大多數(shù)情況下都能夠解決問題,但是如果是EditText的時候,就很坑了,你會發(fā)現(xiàn)軟件盤都不能夠彈出,更別說輸入文字了,要解決這個問題,就是讓點擊EditText的時候,item最外層不攔截點擊事件就ok了,點解item的時候,在攔截點擊事件也同樣ok了。看getView中關鍵代碼片段:
?
這個是EditText的時候的處理?
setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);?
這個很關鍵,而且是在OnTouchListener中執(zhí)行的,因為在Android中View的觸摸事件傳遞中,View的OnTouchListener調(diào)用是早于其他事件的,而且返回值false,代表目前事件沒有被消耗,繼續(xù)向下傳遞,不影響后續(xù)事件的處理(這里不影響EditText其他事件的處理)
?
?
這個是convertView的處理,同樣也是一行關鍵代碼?
.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);?
下面附上適配器中的代碼和布局代碼,需要的同學自己copy一下看看吧:?
item布局代碼:
?
BaseAdapter的代碼:
public class NormalAdapter extends ArrayAdapter<String> {private List<String> mDatas;private Context mContext;public NormalAdapter(Context context, List<String> objects) { super(context, R.layout.activity_list, objects); mDatas = objects; mContext = context; } @Override public View getView(final int position, View convertView, final ViewGroup parent) { Log.e("tag", parent.toString()); Holder mHolder = null; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate( R.layout.item_group, null); mHolder = new Holder(); mHolder.tvTitle = (TextView) convertView .findViewById(R.id.tvGroupTitle); mHolder.edtInput = (EditText) convertView .findViewById(R.id.edtGroupContent); convertView.setTag(mHolder); } else { mHolder = (Holder) convertView.getTag(); } mHolder.tvTitle.setText(mDatas.get(position)); mHolder.edtInput.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { ((ViewGroup) v.getParent()) .setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); return false; } }); convertView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { ((ViewGroup) v) .setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); Toast.makeText(mContext, "點擊了item", Toast.LENGTH_LONG).show(); return true; } }); return convertView; } private static final class Holder { TextView tvTitle; EditText edtInput; } }?
看看代碼是不是解決問題了,可以的話,就給個贊吧!哈哈-^–^
轉(zhuǎn)載于:https://www.cnblogs.com/lingzhao/p/5594053.html
總結(jié)
以上是生活随笔為你收集整理的ListView中含有EditText时候--要命的焦点问题迎刃而解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 技术发展瓶颈的突破
- 下一篇: 怎么关闭电脑触摸屏 如何禁用电脑触摸屏