当我重置EditTexts时,如何停止改变焦点?

时间:2014-09-16 14:57:09

标签: android android-layout android-activity android-edittext android-view

我的片段有一个重置按钮,可以清除一些EditTexts并将默认值放在其他内容中。发生这种情况时,焦点会转到最后一个给出默认值的EditText(有时会使屏幕滚动)。我不想重点改变。屏幕重置时有没有办法防止焦点变化?

编辑:
根据要求,这是我的布局文件的示例,它演示了如何组织视图(完整文件是超过700行)。所有EditTexts都像这些示例一样嵌套。请注意,我的EditTexts在ScrollView中的RelativeLayout中嵌套了1层或2层。因此,对于他们的共同父母,他们是孙子孙女或曾孙子孙女。

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

2 个答案:

答案 0 :(得分:1)

我将获取当前屏幕上的所有视图,并获取当前具有焦点的视图。

更新以反映您的XML

更新修订后再深入了解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文档:

  

public final boolean requestFocus()

     

在API级别1中添加调用此选项以尝试将焦点放在特定视图上   或者它的一个后代。如果,视图实际上不会成为焦点   它不可聚焦(isFocusable()返回false),或者如果是   可聚焦,在触摸模式下无法集中精力   (isFocusableInTouchMode())当设备处于触摸模式时。也可以看看   focusSearch(int),你打电话说你有焦点,   并且您希望您的父母寻找下一个。这是等效的   使用参数FOCUS_DOWN和null调用requestFocus(int,Rect)。

     

返回此视图或其后代之一是否实际占用   对焦。

希望这会有所帮助。如果您正在使用动态视图并且没有包含所有EditText的xml文件,则必须等到创建整个视图之后再获取子计数,因为默认情况下它将返回0,因为此父布局对此一无所知动态观点。

答案 1 :(得分:0)

您可以在onSaveInstanceState中保存当前具有焦点的EditText或哪个UI控件,然后在屏幕恢复UI时使用savedinstance对象将焦点恢复到该控件。

用于恢复实例的方法与活动不同,而不是片段。使用Activities,它是onRestoreInstanceState,使用片段,你使用onActivityCreated。

请记住,确保在片段中的onActivityCreated方法中,在访问之前检查传递的instanceState Bundle是否为空,因为instanceState仅在初始化时创建Fragment时创建,或者在重新创建时创建片段。