gpt4 book ai didi

android - 在 ListView (Android) 中聚焦 EditTexts 的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:26:07 24 4
gpt4 key购买 nike

我有一个 ListView,每个项目中都有一些 EditText。我对硬件键盘没有任何问题,但使用软键盘时有些问题。我有两个问题。

  1. 当我第一次点击一个 EditText 时,它短暂地看起来有焦点,但在键盘显示后就失去了焦点。然后我必须再次单击 EditText 以获得焦点。
  2. 当具有焦点的 EditText 滚出 View 时,焦点会转到...好吧...请看屏幕截图。我不确定发生了什么。

有关#1 的更多详细信息:

  • 首次加载屏幕时,焦点位于“Gr High School Scale”字段中,但未显示键盘。
  • 如果我立即单击所需的 EditText,它的 OnFocusChangeListener 会告诉我它获得焦点然后失去焦点。在视觉上,我看到光标出现在字段中,但是当键盘加载时,光标跳开(如屏幕截图所示),我不知道焦点去了哪里。

我尝试了一些 ListView 的 Focusable 和 DescendantFocusability 属性,但无济于事。有什么建议吗?

每次有焦点的 EditText 滚出 View 时,就会出现另一个醉酒光标: enter image description here

更新:相关代码。
使用 ListView XML 的 Activity 布局:

<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 :

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);

我不确定还要发布什么。我有 focus 和 textChange 监听器,但即使将它们注释掉,问题仍然存在。让我知道是否还需要其他任何东西。谢谢。

有关触摸 EditText 时焦点的行为方式的更多详细信息:

  1. EditText 被点击(触摸)
  2. EditText 获得焦点
  3. EditText 失去焦点
  4. ListView 获得焦点(并尝试设置子焦点 View requestChildFocus... 似乎没有成功)。
  5. ListView 失去焦点
  6. ListView 获得焦点(并尝试再次设置子焦点)。

以上是基于同时拥有 EditText 和 ListView 的监听器。 注意:使用硬件键盘时,EditText 获得焦点,仅此而已。我认为出现的软键盘会影响焦点。

最终更新:最后,使用 ListView 太困难了,尤其是因为我想根据对一行中 EditText 的更改更新多行。当键盘打开并且 ListView 只考虑在任何时候存在的几行时,这很难做到。

我改为制作嵌套的 LinearLayouts。每个水平布局都是一个“行”,我将它们放在 ArrayList 中以便管理它们,相对而言(仍然不容易),这是小菜一碟。

最佳答案

您正面临 ListView 回收问题。当您向上或向下滚动或键盘出现时 ListView 再次刷新并失去您的 EditText 焦点。所以,首先阅读 this answer to understand ListView Recycling mechanism然后按照我这边的建议在我的脑海中解决你当前的场景。

我建议您应该在ListView 项上使用Button,此按钮的文本应该是通用的,例如Enter Student Info 或任何您喜欢的内容。单击此 Button 后打开 AlertDialog 并设置您的 xml View (当前您所有的 edittexts 如 et_gpa、et_min、et_max 等在 listview 上 项目)

例如:

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();
}

关于android - 在 ListView (Android) 中聚焦 EditTexts 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26519247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com