在ListView中关注EditTexts的问题(Android)

我有一个ListView与每个项目中的一些EditTexts。 我对硬件键盘没有任何问题,但使用软键盘时会出现一些问题。 我有两个问题。

  • 当我第一次点击一个EditText时,它短暂地看起来有焦点,但是一旦键盘显示就失去焦点。 然后,我必须再次点击EditText以获得焦点。
  • 当一个带有焦点的EditText滚动出视图时,焦点将转到......呃......看截图。 我不确定发生了什么。
  • #1更多细节:

  • 当屏幕第一次加载时,焦点位于“Gr高中比例”字段中,但键盘未显示。
  • 如果我立即点击所需的EditText,它的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时焦点如何表现的细节:

  • EditText被点击(触摸)
  • EditText接收焦点
  • EditText失去焦点
  • ListView获得焦点(并尝试设置子焦点视图requestChildFocus ...似乎不成功)。
  • ListView失去焦点
  • ListView获得焦点(并尝试再次设置子焦点)。
  • 以上是基于EditText和ListView的监听器。 注意:通过硬件键盘,EditText获得焦点,就是这样。 我认为出现的软键会影响焦点。

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

    我改为嵌套LinearLayouts。 每个水平布局是一个“行”,我把它们放在一个ArrayList中以便管理它们,这是一块蛋糕,相对而言(仍然不容易)。


    您正面临着ListView回收问题。 当您向上或向下滚动或出现键盘时, ListView再次刷新并丢失EditText's焦点。 所以,首先阅读这个答案来理解ListView Recycling机制,然后在我脑海中按照我的建议来解决当前的情况。

    我建议你应该在ListView Item上使用Button ,并且该按钮的文本应该是通用的,如输入学生信息或任何你想要的。 点击这个Button打开AlertDialog并设置你的xml视图(目前你的所有edittextslistview项目上的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?