我使用listview。列表中的每个项目都包含一个edittext。当我点击一个edittext时,弹出软键盘,我点击的edittext会在短时间内获得焦点,然后丢失它。我必须再次点击才能真正获得焦点(为什么?)
(专注于文字和键盘向上)我滚动列表视图 ...
因为listview元素被回收,焦点重新出现在listtext中其他位置的edittext上,我想这是正常的但是为什么Android不会删除这个该死的焦点!?如果我的用户开始滚动,我怎么能对Android说我不想再把焦点放在edittext上?
以下是活动的代码:
public class SimpleList extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.user_picker);
ListView listview = (ListView)this.findViewById(R.id.user_picker_list);
new UserPickerAdapter(this, listview);
}
适配器的代码:
public class UserPickerAdapter extends BaseAdapter {
private final LayoutInflater mInflater;
private String[] mUsers = {"Guib", "Jonas", "Fred", "Denis", "Arnold", "Francois", "David", "Alex", "Saskia", "Verner", "Anatole"};
public UserPickerAdapter(Context context, ListView listview) {
mInflater = LayoutInflater.from(context);
listview.setAdapter(this);
}
@Override
public int getCount() {
return mUsers.length;
}
@Override
public Object getItem(int position) {
return mUsers[position];
}
@Override
public long getItemId(int position) {
return position;
}
static private class Holder {
TextView username;
}
@Override
public View getView(int position, View convertView, ViewGroup arg2) {
Holder holder;
if (convertView != null) {
holder = (Holder) convertView.getTag();
} else {
holder = new Holder();
convertView = mInflater.inflate(R.layout.user_picker_list_item,null);
holder.username = (TextView) convertView.findViewById(R.id.user_picker_list_item_name);
convertView.setTag(holder);
}
String str = (String)getItem(position);
holder.username.setText(str);
return convertView;
}
以防万一,这是'user_picker.xml'中的代码
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" android:padding="0dp"><ListView android:background="@color/color_grey1" android:cacheColorHint="@color/color_grey1" android:id="@+id/user_picker_list" android:divider="@color/color_blueGrey1" android:layout_height="match_parent" android:layout_width="match_parent"/>
'user_picker_list_item.xml'中的那个
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:orientation="vertical" android:layout_height="fill_parent"><EditText android:layout_height="wrap_content"android:id="@+id/user_picker_list_item_name" android:layout_width="wrap_content" android:minWidth="200dp" android:layout_gravity="center"></EditText></LinearLayout>
答案 0 :(得分:1)
我尝试过Gilbou解决方案,但它对我不起作用,因为我在所有行中都有EditTexts。但是通过一些改变,我可以让它发挥作用:
EditText currentEdit;
public View getView(int q, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView==null) {
convertView = (LinearLayout)inflater.inflate(R.layout.grade_row, null);
holder = new ViewHolder();
//Inflate holder
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
if (listView.getSelectedItemPosition() == ListView.INVALID_POSITION) {
if (currentEdit!=null)
currentEdit.requestFocus();
}
//update row items
return convertView;
}
此外,为listview中的每个EditText添加焦点更改侦听器:
myEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if(!hasFocus)
currentEdit = myEditText;
}
}
答案 1 :(得分:0)
我认为找到了解决方案......
我通过以下方法替换了适配器的getView()方法中的部分代码:
if (convertView != null) {
holder = (Holder) convertView.getTag();
if (((ListView)arg2).getSelectedItemPosition() == ListView.INVALID_POSITION) {
arg2.requestFocus();
}
}
答案 2 :(得分:0)
您需要添加
以XML格式
机器人:descendantFocusability =&#34; afterDescendants&#34;
在Java中
listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
我认为它有效。
答案 3 :(得分:0)
也许我来晚了,但我希望这会对某人有所帮助。 Sangeeth Kumar的答案是正确的,但需要在清单中添加另一行代码。
这里的问题是当软键盘弹出时,屏幕上的内容被强制滚动和调整大小。 当滚动ListView(或ExpandableListView)时,所有视图都将再次呈现,因此以前要聚焦的项目行中的EditText字段对象现在是一个完全不同的对象。
因此,要解决此问题,您需要添加两行代码:
将以下行添加到ListView项目XML:
android:descendantFocusability="beforeDescendants"
将以下行添加到包含应用程序清单中ListView(或ExpandableListView)的活动标签中
android:windowSoftInputMode="adjustPan"
希望这会有所帮助:)