所以我目前在FragmentA.java中,这是一个由不同EditText
和Checkbox
es组成的类,供用户按下和输入。
我的问题是,我有这个重置按钮,如何重置整个片段视图? (例如,EditText
将被设置为空字符串,或者值为0,就像创建时一样。)
P.S。当然我可以通过编程方式逐个设置editText / Checkbox,但是有很多它们和其他视图,所以我想知道是否有一种很好的方法可以重置所有这些视图。
答案 0 :(得分:2)
让我们分解为步骤:
如何做到这一点取决于你已经拥有的东西。如果字段是在代码中创建的,那很简单:只需将引用存储在List<CommonBaseType>
中。
如果从XML Layout加载它们,则有多个选项。如果您只想重置某些类型的所有视图,则可以通过获取对其ViewGroup
(布局)的引用来迭代视图层次结构,并使用getChildCount()
迭代子项和getChildAt(int)
。然后,检查孩子的类型。如果它是ViewGroup
,请检查它的子项。如果它是EditText
或CheckBox
,请将其添加到列表中。
如果您需要更多控制权并且不希望重置所有视图,则可以使用某些内容标记所需的视图。您可以使用android:tag
-attribute在XML中标记视图,并在使用View.findViewWithTag(Object)
-method充气后查找它们。
现在您已经拥有了引用,您可以通过简单地遍历在步骤1中创建的集合并根据其类型处理它们来重置它们。一些伪代码:
List<View> form_elements = findViewsToReset();
for (View element : form_elements){
if (element instanceof EditText){
((EditText) element).setText("");
} else if (element instanceof CheckBox){
((CheckBox) element).setChecked(false);
}
// and so forth...
}
这样的内容会将表单中的所有字段重置为默认值,具体取决于其类型。
如果要将视图重置为原始值,则应该&#34; index&#34;设置初始值时的那些(如果通过XML设置值,则可能在通货膨胀后直接进行)。
要执行此操作,只需在步骤1中运行您的列表,然后从其ID到其值的映射:
List<View> form_elements = findViewsToReset();
Map<Integer, Object> default_values = new HashMap<>(form_elements.size());
for (View element : form_elements){
if (element.getId() == View.NO_ID){
// We have nothing to identify this view by...
continue;
}
// Store the default values away:
if (element instanceof EditText){
default_values.put(
element.getId(),
((EditText) element).getText()
);
} else if (element instanceof CheckBox){
default_values.put(
element.getId(),
((CheckBox) element).isChecked()
);
}
// and so forth...
}
稍后当您想要重置表单元素时,您可以再次迭代列表并从地图中获取默认值。根据字段类型(EditText
- &gt; String
,CheckBox
- &gt; Boolean
,etz)投放它们并设置值。
重置RadioGroup只需在其上调用clearCheck()
即可归档,这会产生令人讨厌的副作用,即触发关联的OnCheckedChangeListener
(您可能不需要,这取决于您是什么?在听众中做。)
最简单的方法是在调用clearCheck()
之前取消注册侦听器,然后重新注册它。这可以通过覆盖RadioGroup.clearCheck()
:
/**
* When {@link #clearCheck()} is called, the registered (if any) {@link android.widget.RadioGroup.OnCheckedChangeListener} will <b>not</b> be called.
* @author Lukas Knuth
* @version 1.0
*/
public class CustomRadioGroup extends RadioGroup {
private OnCheckedChangeListener checked_change_listener;
public CustomRadioGroup(Context context) {
super(context);
}
public CustomRadioGroup(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
// We need to store this ourselves, since there is no getter-method for the listener -.-
this.checked_change_listener = listener;
super.setOnCheckedChangeListener(listener);
}
@Override
public void clearCheck() {
// 1. unregister the listener:
super.setOnCheckedChangeListener(null);
// 2. Clear
super.clearCheck();
// 3. restore the listener like it was before:
super.setOnCheckedChangeListener(this.checked_change_listener);
}
}