0

В моем фрагменте есть кнопка сброса, которая очищает некоторые EditTexts и помещает значения по умолчанию в другие. Когда это произойдет, фокус переходит к последнему EditText, которому было присвоено значение по умолчанию (а иногда и прокрутка экрана). Я бы не хотел сфокусироваться. Есть ли способ предотвратить изменение фокуса во время сброса экрана?Как остановить фокус от изменения при сбросе параметров EditTexts?

EDIT:
В соответствии с запросом здесь приведен пример моего файла макета, который демонстрирует, как организованы представления (полный файл - 700 строк). Все EditTexts вложены как эти примеры. Обратите внимание, что мои EditTexts вложены в 1 или 2 слоя в RelativeLayout в ScrollView. Поэтому для их общего родителя они являются внуками или правнуками.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
android:layout_width="match_parent" 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
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"> 

<!-- So that it will scroll if in landscape mode --> 

    <ScrollView 
     android:id="@+id/scrollview_new_grade" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <!-- my main layout frame --> 
     <RelativeLayout 
      android:id="@+id/rel_lay_new_grade" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="8dp" 
      android:layout_marginTop="-4dp" > 

      <!-- Multiple instances like this --> 
      <LinearLayout 
       android:id="@+id/linlay_avg_input" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_below="@id/tv_grade_calc_prompt" 
       android:layout_centerHorizontal="true" 
       android:orientation="horizontal" > 

       <EditText 
        android:id="@+id/et_grade_calc_cur_grade" 
        android:layout_width="95dp" 
        android:layout_height="wrap_content" 
        android:layout_gravity="right" 
        android:layout_weight="0" 
        android:ems="10" 
        android:text="" 
        android:gravity="center_vertical|right" 
        android:inputType="numberDecimal" 
        android:maxLength="7" /> 

      </LinearLayout> 

      <!-- 2 instances like this -->  
      <LinearLayout 
       android:id="@+id/linlay_weight_other_categories" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_below="@id/linlay_weight_input" 
       android:layout_centerHorizontal="true" 
       android:layout_marginTop="5dp" 
       android:gravity="bottom" 
       android:orientation="horizontal" > 

       <RelativeLayout 
        android:layout_width="wrap_content" 
        android:layout_height="match_parent" > 

        <EditText 
         android:id="@+id/et_grade_calc_other_categories" 
         android:layout_width="95dp" 
         android:layout_height="wrap_content" 
         android:layout_alignParentBottom="true" 
         android:layout_gravity="right" 
         android:ems="10" 
         android:text="100" 
         android:gravity="center_vertical|right" 
         android:inputType="numberDecimal" 
         android:maxLength="7" /> 
       </RelativeLayout> 
      </LinearLayout> 

      <!-- 1 radio group like this (options with EditTexts) --> 
      <RadioGroup 
       android:id="@+id/radioGroup1" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_alignLeft="@+id/tv_grade_calc_prompt" 
       android:layout_below="@id/splitline_horz6" 
       android:layout_marginLeft="-8dp" 
       android:layout_marginTop="10dp" > 

       <LinearLayout 
        android:id="@+id/linlay_radio_group_0" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" > 

        <!-- stuff --> 

        <EditText 
         android:id="@+id/et_grade_calc_target" 
         android:layout_width="85dp" 
         android:layout_height="wrap_content" 
         android:layout_gravity="right" 
         android:layout_weight="0" 
         android:gravity="center_vertical|right" 
         android:inputType="numberDecimal" 
         android:maxLength="7" 
         android:width="70dp" /> 

       </LinearLayout> 

     </RelativeLayout> 
    </ScrollView> 

+0

отправьте свой файл макета. –

+0

см. Обновление ниже –

+0

вы можете предоставить полный 700-строчный XML-файл? Я замечаю, что XML также плохо сформирован, у вас есть открытый атрибут в RadioGroup ... –

ответ

1

Я бы все виды, которые в настоящее время находятся на экране, и получить представление, что в настоящее время имеет фокус.

Update, чтобы отразить ваш XML

Update пересмотренную снова После принятия более глубокий взгляд на XML Что-то вроде:

// Hold a reference to the id 
int childIdWithFocus = 0; 

// Your main Layout which is the first item of your scroll view 
ViewGroup parentViewGroup = (ViewGroup) getView().findViewById(R.id.rel_lay_new_grade); 

// Then get count of all views 
int childCount = parentViewGroup.getChildCount(); 

// Then using the Views count 
for(int i = 0; i < childCount; i++){ 

    // Check if the child elements are ViewGroups 
    if(parentViewGroup.getChildAt(i) instanceof ViewGroup){ 

    ViewGroup innerParent = (ViewGroup) parentViewGroup.getChildAt(i); 
    int innerParentCount = innerParent.getChildCount(); 

    // Loop through inner view groups 
    for(int j = 0; j < innerParentCount; j++){ 

     // Check for nested ViewGroups 
     if(innerParent.getChildAt(i) instanceof ViewGroup){ 

      // Again get the childCount of the ViewGroup 
      ViewGroup childInnerViewGroup = (ViewGroup) innerParent.getChildAt(i); 
      int childCountOfInnerParentView = childInnerViewGroup.getChildCount(); 

      for(int k = 0; k < childCountOfInnerParentView; k++){ 

       // Now check for EditText since we are in another level 
       if(innerParent.getChildAt(k) instanceof EditText){ 

        EditText currentEditText = (EditText) innerParent.getChildAt(k); 
        boolean isFocused = currentEditText.isFocused(); 
        if(isFocused){ 
        childIdWithFocus = currentEditText.getId(); 
        return; 
        } 
       } 
      } 
     } 
     } 
    } 
} 


// Then sometime after refreshing your view 

EditText childWithFocus = (EditText) findViewById(childIdWithFocus); 
childWithFocus.requestFocus(); 

Самая большая проблема с этим методом

Непосредственно из Android. Документы:

общественное окончательное логическое requestFocus()

Добавлено в уровне API 1 Позвоните, чтобы это попытаться сфокусировать внимание на конкретной целью или одного из его потомков. Вид не будет на самом деле фокусироваться, если не фокусируется (isFocusable() возвращает false), или если он сфокусирован и не фокусируется в сенсорном режиме (isFocusableInTouchMode()), пока устройство находится в режиме касания. См. Также focusSearch (int), который вы называете, чтобы сказать, что у вас есть фокус, и вы хотите, чтобы ваш родитель искал следующую. Это эквивалентно для вызова requestFocus (int, Rect) с аргументами FOCUS_DOWN и null.

Возвращает, действительно ли этот взгляд или один из его потомков принял фокус.

Надеюсь, это поможет. Если вы используете динамические представления и не имеете xml-файла со всеми EditText, вам придется подождать, пока ваш весь вид не будет создан до того, как будет получен счетчик, потому что он будет возвращать 0 по умолчанию, поскольку этот родительский макет ничего не знает о динамические представления.

+0

Спасибо за отличный ответ, но он не работает для меня, я думаю, потому что мои EditTexts не являются частью одного и того же родителя. Некоторые из них вложены под одним родителем, а другие - под 2. И даже когда я вызываю 'mEditText.requestFocus()' на известном статическом представлении в конце моего метода сброса, фокус заканчивается в другом EditText (тот, который я уже сбросил к его «100» умолчанию). – NSouth

+0

@NSouth вы можете разместить свой XML, а затем я могу обновить код. Я знаю, что это будет возможно, если вы ищете правильные виды. Спасибо –

+0

Я добавил свой XML. Большое спасибо за то, что помогли мне в этом. – NSouth

0

Вы можете сохранить какой EditText или какой элемент управления пользовательского интерфейса в настоящее время имеет фокус в onSaveInstanceState, а затем использовать сохраненный объект-объект для восстановления фокуса этого элемента управления, когда экран восстанавливает пользовательский интерфейс.

Какой метод используется для восстановления экземпляра, он отличается от активности, чем для фрагментов. С Activity это onRestoreInstanceState, а с помощью фрагментов, которые вы используете onActivityCreated.

Не забудьте убедиться в том, что в методе onActivityCreated в вашем фрагменте вы проверяете, что переданный экземплярStartBundle не имеет значения null перед его доступом, поскольку экземплярState создается только при создании фрагмента в начальное время или при повторном создавая фрагмент.

Смежные вопросы