在尝试使用EditTexts 在ListView 内创建接口失败后,我只能对您说“不要!”。当你有足够的项目需要滚动ListView,焦点会在这里和那里跳跃,你必须保存EditText 的状态等等,你会遇到更多麻烦。似乎一般的想法是在ListView 中使用EditText 是不值得的。
经过大量研究,我可以建议以下对我有帮助的方法:
我继承了ListView 并重写了 layoutChildren 方法,在其中我执行以下操作:
@Override
protected void layoutChildren() {
super.layoutChildren();
final EditText tv = (EditText)this.getTag();
if (tv != null)
{
Log.d("RUN", "posting delayed");
this.post(new Runnable() {
@Override
public void run() {
Log.d("RUN", "requesting focus in runnable");
tv.requestFocusFromTouch();
tv.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , tv.getWidth(), tv.getHeight(), 0));
tv.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , tv.getWidth(), tv.getHeight(), 0));
}
});
}
}
当我知道哪个EditText 应该获得焦点时(当我的适配器getView 被调用时我知道这一点)我将这个特定的EditText 设置为ListView 的标签。然后 ListView 自行布局,我的帖子线程已排队。它运行并请求焦点,但是由于在我的情况下还不够,我还生成了两个 MotionEvents 来简单地模拟点击。显然这足以让软键盘出现。
这背后的原因在此处的答案中进行了解释:
Android Actionbar Tabs and Keyboard Focus