【问题标题】:Android: How to set Visibility permanentlyAndroid:如何永久设置可见性
【发布时间】:2016-07-19 03:33:38
【问题描述】:

这不是“如何设置可见性”问题的重复。

我有一个活动 1 和一个活动 2,当我开始活动 2 时,我在侦听器中设置了从 Gone 到 Visible 的布局并且它可以工作,我的问题是,当我返回活动 1 并返回活动 2 时,布局的可见性又回到了 Gone。如何让布局在离开时保持可见?

Activity2.java:

@Override
 public void onClick(View v) {

        if (FirstLayout.getVisibility() == View.INVISIBLE) {
            FirstLayout.setVisibility(View.VISIBLE);
         }
}

Activity2.xml:

 <LinearLayout
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:visibility="invisible"
      android:id="@+id/oneLayout"
      android:animateLayoutChanges="true"
      android:orientation="vertical">

      <!-- one Button -->
      <!-- one TextView -->   

  </LinearLayout>

【问题讨论】:

  • 在 sharedPrefs 中保存视图的可见性状态
  • 所以我想这是一个重复。我的道歉
  • 在 Activity 的 元素中设置 android:launchMode = "SingleTop",该元素包含要隐藏的布局(在清单文件中),看看会发生什么
  • @Sam 将其添加到清单中并没有发生任何事情,尽管当我将其更改为“singleTask”时它确实有效,但活动需要更长的时间才能启动,并且动画不同且更慢,同样的事情发生了当我将其更改为“singleInstance”时。 “singleTask”和“singleInstance”到底是什么意思?
  • @Sam 好的,我刚刚阅读了有关它的文档,如果我关闭应用程序,它不会保存它。似乎 sharedPrefs 是正确的方法,谢谢

标签: java android xml android-studio mobile


【解决方案1】:

如上面 cmets 中所说,在您的 Activity2.java 中:

SharedPreferences sharedPreferences;

在Activity2的onCreate方法中:

 sharedPreferences=getPreferences(Context.MODE_PRIVATE);
 FirstLayout.setVisibility(sharedPreferences.getBoolean("visibility",false)); 

然后:

 @Override
    public void onClick(View v) {
    if (FirstLayout.getVisibility() == View.INVISIBLE) {
        FirstLayout.setVisibility(View.VISIBLE);
        SharedPreferences.Editor editor=sharedPreferences.edit();
        editor.putBoolean("visibility",true).commit();
     }
}

【讨论】:

  • 这就是我要找的。我可以使用相同的 SharedPreferences 来存储其他布局的可见性,但我必须创建一个新的编辑器来编辑每个键,对吧?
  • 不,您可以使用相同的编辑器,但您必须在要保存更改时调用comit()。
  • 我不认为它应该正常工作,当我卸载应用程序并再次运行它时,布局在不应该时已经可见。我没有放一个布尔值,而是放一个 Int,因为 Visibility 是 0、1 或 2
  • 在卸载应用程序期间,所有 sharedpreferences 和数据都将被删除,问题是 android 备份服务,我建议您在应用程序开发期间通过将其添加到清单文件来禁用它:android:allowBackup="false"
  • 最好使用与您的应用版本相关的唯一名称的共享首选项
【解决方案2】:

您可以通过以下方法保存上一个状态

boolean mState = false;
final String STATE_VISIBILITY = "state-visibility";

// somewhere in the code assign a value to mState 
// i.e. mState = false (if GONE default) and mState = true (if VISIBLE)

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putBoolean(STATE_VISIBILITY, mState);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

然后恢复

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    mState = savedInstanceState.Boolean(STATE_VISIBILITY);
    view.setVisibility(mState?View.VISIBLE:View.GONE);

    }

更多关于http://developer.android.com/training/basics/activity-lifecycle/recreating.html

【讨论】:

  • 如何定义 STATE_VISIBILITY 和 mState?由于可见性值为 0、1 和 2,它不应该是 saveInstanceState.putInt() 吗?请原谅不专业的问题
  • 当然这是你的选择,如果你想保持两个以上的状态,你可以使用 putInt。我想你想保持可见或消失。
  • 是的,我真的不需要两个以上的状态,但是如何创建 STATE_VISIBILITY 和 mState?
  • 这些值将来会被用户更改,我认为使用 Shared Preferences 是一个更好的解决方案,不是吗?
  • 此方法仅保存活动转换期间的最后状态。如果您想保存应用程序首次启动的状态 Shared Prefs 是正确的方法。然后使用 bryan c 的方法。
猜你喜欢
  • 2021-12-27
  • 2014-05-28
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多