解决ListView中使用EditText所遇到的一些冲突

 大家都知道在listView中使用editText,在输入过程中是有冲突的。今天稍微研究了一下这个问题,有一点点小小的心得和大家一起分享下。

  首先建立一个最简单的demo,主界面就是一个ListView,其中list_item的布局代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version= "1.0" encoding= "utf-8" ?>
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
     android:orientation= "vertical" android:layout_width= "match_parent"
     android:layout_height= "match_parent" >
     <TextView android:layout_width= "wrap_content"
         android:layout_height= "wrap_content" android:text= "TextView"
         android:id= "@+id/textView1" android:textSize= "20sp" ></TextView>
     <EditText android:layout_width= "match_parent"
         android:layout_height= "wrap_content" android:id= "@+id/editText1" >
     </EditText>
 
</LinearLayout>

很简单list_item包含一个TextView,还有一个就是EditText。

运行后在某一项EditText进行输入,点击返回键隐藏输入法键盘时会遇到一个问题即所有项的EditText内容都被清空了。

解决办法:在Manifest中Activity标签下加入android:windowSoftInputMode="adjustPan"。

这个问题是解决了,但是还有其他的问题。

当你点击最后一项时,没有问题,此时最后一项的EditText拥有焦点。然后,点击系统返回键,再点击最后一项,此时你会发现输入法将最后一项完全挡住了(这样很影响用户体验)。

解决方法:当点击系统返回键时,让其释放焦点。

有人肯定会先这样处理:

?
1
2
3
4
5
6
7
8
@Override
     public boolean onKeyDown( int keyCode, KeyEvent event) {
         // TODO Auto-generated method stub
         if (keyCode == KeyEvent.KEYCODE_BACK) {
              //释放焦点
         }
         return super .onKeyDown(keyCode, event);
     }

但是很遗憾,当输入法键盘显示的时候,你点击系统的返回键事件被捕获了,而不会在onKeyDown里执行。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
     if (context != null ) {
         InputMethodManager imm = (InputMethodManager) context
                 .getSystemService(Context.INPUT_METHOD_SERVICE);
         if (imm.isActive() && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
             //释放焦点
             for ( int i = 0 ; i < getChildCount(); i++) {
                 View view = getChildAt(i);
                 EditText editText1 = (EditText) view
                         .findViewById(R.id.editText1);
                 editText1.clearFocus();
             }
         }
     }
     return super .dispatchKeyEventPreIme(event);
}

自定义控件重写dispatchKeyEventPreIme方法判断软键处于活动状态,并且用户按下了返回键盘。

说到这里提一下,自定义adapter的getView方法中view不要复用

?
1
2
3
4
5
@Override
     public View getView( int position, View convertView, ViewGroup parent) {
         convertView = mLayoutInflater.inflate(R.layout.list_item, null );
         return convertView;
     }

写到这里觉得这种实现方式和ScrollView+LinearLayout本质差不多

 顺便提一下怎么保存数据:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
editText1.addTextChangedListener( new TextWatcher() {
 
             @Override
             public void onTextChanged(CharSequence s, int start, int before,
                     int count) {
             }
 
             @Override
             public void beforeTextChanged(CharSequence s, int start, int count,
                     int after) {
             }
 
             @Override
             public void afterTextChanged(Editable s) {
                 //保存数据
             }
         });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,如果姓名本来就在ListView,您可以按照以下步骤来实现点击姓名拨打对应电话号码的功能: 1. 创建一个ListView布局,用于显示联系人的姓名和电话号码。 2. 创建一个自定义的Adapter类,用于将姓名和电话号码显示在ListView。 3. 在Adapter类的getView()方法,为ListView的每个列表项添加一个OnClickListener,当用户点击姓名时,使用隐式Intent拨打对应的电话号码。 下面是一个简单的示例代码片段,用于实现上述功能: ```java public class ContactListAdapter extends BaseAdapter { private List<Contact> contactList; private Context context; // 构造函数 public ContactListAdapter(Context context, List<Contact> contactList) { this.context = context; this.contactList = contactList; } @Override public View getView(final int position, View convertView, ViewGroup parent) { // 获取ListView的每个列表项布局 View view = LayoutInflater.from(context).inflate(R.layout.list_item, null); // 获取姓名和电话号码的TextView控件 TextView nameTextView = view.findViewById(R.id.nameTextView); TextView phoneTextView = view.findViewById(R.id.phoneTextView); // 显示姓名和电话号码 final Contact contact = contactList.get(position); nameTextView.setText(contact.getName()); phoneTextView.setText(contact.getPhone()); // 为姓名的TextView控件添加OnClickListener nameTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 使用隐式Intent拨打电话 Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + contact.getPhone())); context.startActivity(intent); } }); return view; } // 其他方法省略 } ``` 在上述示例代码,ContactListAdapter类是自定义的Adapter类,用于将姓名和电话号码显示在ListView。在getView()方法,为每个列表项添加一个OnClickListener,当用户点击姓名时,使用隐式Intent拨打对应的电话号码。在OnClickListener使用ACTION_DIAL操作和电话号码URI来创建一个拨打电话的隐式Intent,然后使用startActivity()方法启动该Intent。 请注意,ACTION_DIAL操作只会打开拨号器应用程序,并自动填充电话号码,但不会直接拨打电话。如果您想要直接拨打电话,应使用ACTION_CALL操作,但是需要注意用户的权限授权问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值