我的片段有一个重置按钮,可以清除一些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>
答案 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时创建,或者在重新创建时创建片段。