重置片段中的所有视图

时间:2015-06-13 18:00:24

标签: android android-fragments android-viewpager android-view

所以我目前在FragmentA.java中,这是一个由不同EditTextCheckbox es组成的类,供用户按下和输入。

我的问题是,我有这个重置按钮,如何重置整个片段视图? (例如,EditText将被设置为空字符串,或者值为0,就像创建时一样。)

P.S。当然我可以通过编程方式逐个设置editText / Checkbox,但是有很多它们和其他视图,所以我想知道是否有一种很好的方法可以重置所有这些视图。

1 个答案:

答案 0 :(得分:2)

让我们分解为步骤:

1。获取参考资料

如何做到这一点取决于你已经拥有的东西。如果字段是在代码中创建的,那很简单:只需将引用存储在List<CommonBaseType>中。

如果从XML Layout加载它们,则有多个选项。如果您只想重置某些类型的所有视图,则可以通过获取对其ViewGroup(布局)的引用来迭代视图层次结构,并使用getChildCount()迭代子项和getChildAt(int)。然后,检查孩子的类型。如果它是ViewGroup,请检查它的子项。如果它是EditTextCheckBox,请将其添加到列表中。

如果您需要更多控制权并且不希望重置所有视图,则可以使用某些内容标记所需的视图。您可以使用android:tag-attribute在XML中标记视图,并在使用View.findViewWithTag(Object)-method充气后查找它们。

2。重置

现在您已经拥有了引用,您可以通过简单地遍历在步骤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...
}

这样的内容会将表单中的所有字段重置为默认值,具体取决于其类型。

3。重置回原始值

如果要将视图重置为原始值,则应该&#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; StringCheckBox - &gt; Boolean,etz)投放它们并设置值。

Bonus:Nasty RadioGroup

重置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);
    }
}