平时使用EditText没什么问题,但是一在ListView中使用就有一大堆问题,首先是焦点问题:一进到界面ListView里的最后一个EditText 获取焦点并弹出输入法,找到的解决方法是在 EditText的上一层加入
android:focusable="true"
android:focusableInTouchMode="true"
<LinearLayout
android:id="@+id/insearch_editline"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center_vertical"
android:orientation="horizontal" >
<EditText
android:id="@+id/insearch_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@null" >
</EditText>
接着就是点击其中一个EditText弹出输入法时,获取的焦点消失了,再点又有,退出输入法时输入标又没了,网上找到的方法是:
在Manifest中Activity标签下加入android:windowSoftInputMode="adjustPan"。
当你点击偏后的一项时,没有问题,输入框被托起,输入法不会挡住,退出输入法再点同一个EditText就挡住了,找到的方法是退出输入法时释放其焦点,但我弄了好久都没有解决。
最后决定转换问题,就是把前面所遇到问题的解决方法都去掉,把输入法挡住的问题转成获取焦点的问题,然后解决焦点乱跑的问题就行了,以下是代码,随便加上了显示和保存数据的功能:
private String Userdata[] = { "省市", "生日", "性别", "昵称", "密码" };//显示的信息
private String[] Data = new String[Userdata.length];//保存数据
private int index = -1;// 保存当前item的位置,默认-1全部没有焦点
/**所用到的适配器*/
class PersonaAdapter extends BaseAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
return Data.length;
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
// TODO Auto-generated method stub
final Holder holder = new Holder();
convertView = LayoutInflater.from(getBaseContext()).inflate(
R.layout.perfect_data_item, null);
holder.personaText = (TextView) convertView
.findViewById(R.id.persona_text);
holder.personaEdit = (EditText) convertView
.findViewById(R.id.persona_edit);
holder.personaText.setText(Userdata[position]);
//点击时获取焦点和保存点击位置
holder.personaEdit.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
holder.personaEdit.setFocusableInTouchMode(true);
index = position;
}
return false;
}
});
if (index == position) {
// 如果当前的行下标和点击事件中保存的index一致,EditText设置焦点。
holder.personaEdit.setFocusableInTouchMode(true);
holder.personaEdit.requestFocus();
} else {
holder.personaEdit.setFocusableInTouchMode(false);
holder.personaEdit.clearFocus();
}
//显示保存的数据
if (Data[position] != null) {
holder.personaEdit.setText(Data[position] + "");
}
holder.personaEdit
.addTextChangedListener(new textWatcher(position));
return convertView;
}
}
class Holder {
public EditText personaEdit;
public TextView personaText;
}
class textWatcher implements TextWatcher {
int position;
public textWatcher(int position) {
this.position = position;
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
//保存数据
Data[position] = s.toString();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
}
在适配器里的getView不能复用,会造成数据存储混乱,
这样子就直接在代码里解决了,不用加入一些其他的。