首页 > 解决方案 > 片段保存视图状态

问题描述

我有一些具有这种结构的片段:

    <RelativeLayout
        android:id="@+id/control_panel"
        android:visibility="gone">

        <RelativeLayout
            android:id="@+id/control_panel_icon">

            <ImageView
                android:id="@+id/control_panel_icon_1"
                android:src="@drawable/ic_control_panel_icon_1" />

            <ImageView
                android:id="@+id/control_panel_icon_2"
                android:src="@drawable/ic_control_panel_icon_2"
                android:visibility="gone"/>
        </RelativeLayout>

        <TextView
            android:id="@+id/control_panel_tv"
            android:text="@string/not_available" />
    </RelativeLayout>

在 Fragment 类里面我有onSaveInstanceStateonActivityCreated

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("tv", panel_tv.getText().toString());
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) 
        panel_tv.setText(savedInstanceState.getString("tv"));
}

所以它解决了保存状态TextView

在 Fragment 类中,我还设置了使用某些功能显示的图像:

public void setIcon(boolean condition){
    if (condition) {
         control_panel_icon_1.setVisibility(View.GONE);
         control_panel_icon_2.setVisibility(View.VISIBLE);
    } else {
         control_panel_icon_1.setVisibility(View.VISIBLE);
         control_panel_icon_2.setVisibility(View.GONE);
    }
}

有没有办法保存和恢复当前显示的图像?

我知道,我不应该保存整个小部件,但是如果我可以保存状态,RelativeLayout它会恢复它的所有子状态吗?

标签: androidandroid-layoutandroid-fragmentsonsaveinstancestate

解决方案


在 Fragment 类中,声明一个私有变量:

private boolean condition; // rename to something more descriptive

现在setIcon()存储值:

this.condition = condition;

最后将其保存到包中onSaveInstanceState()

outState.putBoolean("condition", this.condition);

并阅读onActivityCreated()

this.condition = savedInstanceState.getBoolean("condition");
this.setIcon(this.condition);

笔记

您不需要从TextView. 调用super.onSaveInstanceState()已经为您解决了这个问题。


推荐阅读