代码之家  ›  专栏  ›  技术社区  ›  Alex

片段保存视图状态

  •  1
  • Alex  · 技术社区  · 8 年前

    我有一些碎片有这样的结构:

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

    在碎片类中 onSaveInstanceState onActivityCreated :

    @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 它能恢复孩子的所有状态吗?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Code-Apprentice    8 年前

    在你的片段类中,声明一个私有变量:

    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() 已经帮你搞定了。

        2
  •  2
  •   Mosius sMiLo    8 年前

    你可以保存 condition 在里面 outState 如下所示:

    outState.putBoolean("condition", condition);
    

    然后阅读并更新图像视图

    setIcon(savedInstanceState.getBoolean("condition"))
    

    或者可以通过以下方式保存图像视图的可见性状态 putInt 方法:

    outState.putInt("ic1", control_panel_icon_1.getVisibility());
    outState.putInt("ic2", control_panel_icon_2.getVisibility());
    

    然后恢复状态:

    control_panel_icon_1.setVisibility(savedInstanceState.getInt("ic1"));
    control_panel_icon_2.setVisibility(savedInstanceState.getInt("ic2"));
    
    推荐文章