Проблемы с фокусировкой EditTexts в ListView (Android)
У меня есть ListView с несколькими EditTexts в каждом элементе. У меня нет проблем с аппаратной клавиатурой, но с мягкой клавиатурой все немного волнуется. У меня есть два вопроса.
Когда я в первый раз щелкаю на EditText, кажется, что он на короткое время имеет фокус, но затем теряет фокус, когда клавиатура показывается. Я должен затем нажать EditText еще раз, чтобы получить фокус.Когда EditText с фокусом прокручивается вне поля зрения, фокус переходит к ... ну ... см. Скриншот. Я не уверен, что происходит.Подробнее о # 1:
Когда экран загружается впервые, фокус находится в поле «Gr High School Scale», но клавиатура не отображается.Если я немедленно нажму на нужный EditText, егоOnFocusChangeListener
говорит мне, что он получает фокус, а затем теряет фокус. Визуально я вижу, что курсор появляется в поле, но когда клавиатура загружается, курсор отскакивает (как на скриншоте), и я не знаю, куда исчез фокус.Я немного поиграл с атрибутами Focusable и DescendantFocusability ListView, но безрезультатно. Любой совет?
Каждый раз, когда 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);
Я не уверен, что еще отправлять. У меня есть слушатели focus и textChange, но проблема существует, даже если они закомментированы. Дайте мне знать, если что-то еще нужно. Спасибо.
Более подробно о том, как фокус ведет себя при касании EditText:
EditText нажал (коснулся)EditText Получает фокусEditText теряет фокусListView получает фокус (и пытается установить дочерний фокусrequestChildFocus
... не похоже на успех).ListView теряет фокусListView получает фокус (и снова пытается установить дочерний фокус).Вышесказанное основано на наличии слушателей как для EditText, так и для ListView.Замечания: с аппаратной клавиатурой EditText получает фокус и все. Я думаю, что появление мягкой клавиатуры влияет на фокус.
ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ: В конце концов, работать с ListView было слишком сложно, особенно потому, что я хотел обновить несколько строк на основе изменений в EditText в одной строке. Это трудно сделать, когда клавиатура поднята, а ListView считает, что одновременно существует только несколько строк.
Я вместо этого сделал вложенные LinearLayouts. Каждый горизонтальный макет представлял собой «строку», и я поместил их в ArrayList, чтобы управлять ими, и это было сравнительно легко (все еще непросто).