在ListView中关注EditTexts的问题(Android)
我有一个ListView与每个项目中的一些EditTexts。 我对硬件键盘没有任何问题,但使用软键盘时会出现一些问题。 我有两个问题。
#1更多细节:
OnFocusChangeListener
告诉我它接收到焦点,然后失去焦点。 在视觉上,我看到光标出现在字段中,但是当键盘加载光标时(如截图中所示),我不知道焦点在哪里。 我玩过ListView的Focusable和DescendantFocusability属性,但无济于事。 有什么建议?
每次将焦点的EditText滚动到视图外时,会出现另一个醉光标:
更新:相关代码。
使用ListView XML的活动布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res/com.NsouthProductions.gradetrackerpro"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.NsouthProductions.gradetrackerpro.Activity_EditCourseGPA" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="34dp"
android:text="Define the GPA and Percent scale for this course." />
<RadioGroup
android:id="@+id/radioGroup1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView1"
android:layout_marginLeft="5dp" >
<LinearLayout
android:id="@+id/linlay_rad_group_existing_scale"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RadioButton
android:id="@+id/radio0_existing_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:checked="true"
android:text="Existing Scale" />
<Spinner
android:id="@+id/spinner_existing_scales"
android:layout_width="wrap_content"
android:layout_height="33dp"
android:layout_gravity="right"
android:layout_weight="1" />
</LinearLayout>
<LinearLayout
android:id="@+id/linlay_rad_group_new_scale"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<RadioButton
android:id="@+id/radio1_new_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:text="New Scale" />
<TextView
android:id="@+id/textView2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:lines="1"
android:maxLines="1"
android:text=" " />
<EditText
android:id="@+id/editText1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="textPersonName"
android:maxLines="1"
android:scrollHorizontally="true"
android:text="Gr High School Scale" >
<requestFocus />
</EditText>
</LinearLayout>
</RadioGroup>
<LinearLayout
android:id="@+id/linlay_scale_save_buttons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true" >
<Button
android:id="@+id/btn_gpa_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/btn_gpa_save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
<ListView
android:id="@+id/listview_scale"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/linlay_scale_save_buttons"
android:layout_alignParentLeft="true"
android:layout_below="@id/radioGroup1"
android:focusable="true"
android:focusableInTouchMode="true"
android:headerDividersEnabled="true"
android:scrollingCache="true" >
</ListView>
列表项XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linlay_scale_list_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<CheckBox
android:id="@+id/checkbox_scale_item"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="A-" />
<EditText
android:id="@+id/et_gpa"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:enabled="true"
android:inputType="numberDecimal"
android:maxLength="6"
android:text="4.000" />
<EditText
android:id="@+id/et_min"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:enabled="true"
android:inputType="numberDecimal"
android:maxLength="6"
android:text="94.75" />
<EditText
android:id="@+id/et_max"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="numberDecimal"
android:maxLength="6"
android:text="100.0" />
在我的适配器中设置视图:
View v = convertView;
ViewHolder holder;
v = inflater.inflate(R.layout.scale_list_item,
holder = new ViewHolder();
holder.cb = (CheckBox) v.findViewById(R.id.checkbox_scale_item);
holder.et_gpa = (EditText) v.findViewById(R.id.et_gpa);
holder.et_min = (EditText) v.findViewById(R.id.et_min);
holder.et_max = (EditText) v.findViewById(R.id.et_max);
我不知道还有什么要发布。 我有焦点和textChange监听器,但即使这些被注释掉,问题仍然存在。 让我知道是否需要其他任何东西。 谢谢。
更多关于当触摸EditText时焦点如何表现的细节:
requestChildFocus
...似乎不成功)。 以上是基于EditText和ListView的监听器。 注意:通过硬件键盘,EditText获得焦点,就是这样。 我认为出现的软键会影响焦点。
最终更新:最后,使用ListView太困难了,特别是因为我想根据对一行EditText的更改更新多行。 当键盘启动并且ListView只考虑几个行在任何时候存在时很难做到这一点。
我改为嵌套LinearLayouts。 每个水平布局是一个“行”,我把它们放在一个ArrayList中以便管理它们,这是一块蛋糕,相对而言(仍然不容易)。
您正面临着ListView
回收问题。 当您向上或向下滚动或出现键盘时, ListView
再次刷新并丢失EditText's
焦点。 所以,首先阅读这个答案来理解ListView
Recycling机制,然后在我脑海中按照我的建议来解决当前的情况。
我建议你应该在ListView
Item上使用Button
,并且该按钮的文本应该是通用的,如输入学生信息或任何你想要的。 点击这个Button
打开AlertDialog
并设置你的xml视图(目前你的所有edittexts
像listview
项目上的et_gpa,et_min,et_max等)
例如:
btnInfo.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showStudentInfoAlert();
}
});
public void showStudentInfoAlert()
{
AlertDialog.Builder builder = new AlertDialog.Builder(context);
LayoutInflater in = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = in.inflate(R.layout.your_xml_having_edittexts, null);
EditText et_gpa = (EditText) v.findViewById(R.id.et_gpa);
//add all edit texts like this and after that just set view on alert dialog
builder.setTitle("Enter student's info");
builder.setView(v);
builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//save all edittexts values and do what erver you want with those values
}
});
dialog.show();
}
首先当屏幕加载时,由于xml中的<requestFocus />
,所以焦点位于“Gr高中比例”字段。 但这并不保证键盘可能会显示..使键盘显示使用getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
我也认为它立即失去了焦点,因为listview已经从edittext中取消了焦点
<ListView
android:id="@+id/listview_scale"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/linlay_scale_save_buttons"
android:layout_alignParentLeft="true"
android:layout_below="@id/radioGroup1"
android:focusable="true" //this
android:focusableInTouchMode="true" // and that
android:headerDividersEnabled="true"
android:scrollingCache="true" >
,并且因为你的listview edittext都没有要求焦点,所以焦点停留在listview而不是edittext ..因此你需要将焦点重新回到edittext ..也从它的android文档中声明默认情况下默认情况下用户不能将焦点移动到视图;并且它还声明“如果focusableInTouchMode对于视图是真实的,那么该视图可以在点击时获得焦点,并且如果另一个视图没有被点击则可以保持焦点这个属性设置为true“,主要是当你第一次创建一个edittext时,它会自动向它添加<requestFocus />
,指定它需要关注焦点,或者它可以获得焦点..但在你的情况下,并且对于这个文档,edittext将永远不会保持焦点,因为listview是从他身上拿走它..所以简而言之,请尝试所有视图(包括你的edittext)你想要关注像你在列表视图
android:focusable="true"
android:focusableInTouchMode="true"
所以尝试在edittext上,让我知道它是否有帮助..感谢等待
链接地址: http://www.djcxy.com/p/24211.html上一篇: Issues focusing EditTexts in a ListView (Android)
下一篇: Selecting an Android EditView's text when it gets focus?