草庐IT

安卓:设置初始保存状态

coder 2023-11-27 原文

我有一个使用 Fragment 的选项卡式应用程序s,还有一个小问题。

MainActivity (扩展 FragmentActivity - 没有为 onCreate 上的布局规范保存代码)包括 Fragment称为 TabsFragment (扩展 Fragment ,实现 OnTabChangeListener )在其布局中(将选项卡本身包含在 FrameLayout 中),切换出子 Fragment使用Transaction

后者子Fragments当用户转动设备、访问另一个应用程序、接听电话或做其他事情时,我希望保存其状态的实际内容。目前子状态Fragment s 没有保存,但 Activity 会记住哪个子- Fragment正在显示。 (因此,如果我让设备处于横向模式并在选项卡 3 处于 Activity 状态时转动设备,选项卡 3 将以纵向模式出现,重置,但显示。因此在我没有做任何事情的情况下保留了一些状态)。

因为我有多种布局(横向和纵向),android:configChanges="orientation"在 list 中不是一个选项 - 我无论如何都不想使用它,因为它是一个美化的创可贴。

我正在使用 v4 支持库(修订版 10),在搜索 API 后,我遇到了 FragmentManager.saveFragmentInstanceState()Fragment.setInitialSavedState(Fragment f) .我已经为每个子 Fragment 放置了 saveFragmentInstanceState()在覆盖onPause() TabsFragment的方法| .我不确定这是否有效,因为无论我把 setInitialSavedState 放在哪里, 它给出了一个 IllegalStateException - 但即使我刚刚初始化一个新的子 - Fragment 也会发生这种情况标签。当我将它放入 onResume 时它也会崩溃在 TabsFragment .

代码 fragment :

//... this is the 'showTab' method
if(getFragmentManager().findFragmentByTag(id) == null)
{
  Fragment f = null;
  if(BASIC_TAB.equals(id))
  {
    f = new BasicTabFragment();
    f.setInitialSavedState(basicState); // basicState was set in onPause()
    getFragmentManager().beginTransaction().replace(tabNo, f, tabID).commit();
  }
}

如果类似代码放在onResume ,我收到以下错误:

错误 fragment : FATAL EXCEPTION: main java.lang.RuntimeException: Unable to resume activity (org.example.App/org.example.App/MainActivity): java.lang.IllegalStateException: Fragment already active

<p>-snip-</p>
Caused by: java.lang.IllegalStateException: Fragment already active at  android.support.v4.app.Fragment.setIniailSavedState(Fragment.java:507)
at org.example.App.TabsFragment.onResume(TabsFragment.java:223)

很明显,我在生命周期的错误点调用了 setInitialSavedState,但我不清楚何时应该发生这种情况。

我也开始怀疑 FragmentManager.saveFragmentInstanceState() 是否确实是这里使用的最佳选择,因为选项卡式设置的性质有些复杂。如果是这样,使用什么?如何保存应用程序选项卡的状态?

最佳答案

当一个 Activity 被销毁时,Fragments 会从 Activity 中分离出来,并在它被重新创建时重新附加。因此, fragment 应该仍以当前状态存在。重新附加时,将再次调用 OnCreateView。如果您像从头开始一样初始化所有内容(即将列表设置为 new ArrayList()),您将清除 fragment 的状态。

尝试在您的 Fragment 中为所有需要保留的内容创建一个实例变量(即,任何文本字段的字符串 - EditText 字段将如您所述自动保存)。示例:

String text;
TextView tv;

public View onCreateView(LayoutInflater i, ViewGroup vg, Bundle b)
{
   // this will re-inflate everything from the layout. If you initialize any text fields here, it will reset them to the value you set in the xml file
   View v = i.inflate(R.layout.myLayout, vg, false);

   if(text != null)
       tv.setText(text);
}

当您的 TextView 值发生变化时(比如在 OnClickListener 或类似物中),设置 text 的值以及您对它所做的任何其他操作。重新附加 fragment 时,它会将其设置为上次所做的更改。

关于安卓:设置初始保存状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14040203/

有关安卓:设置初始保存状态的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  4. ruby-on-rails - 未初始化的常量 Psych::Syck (NameError) - 2

    在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到ruby​​gems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决

  5. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  6. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  7. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  8. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  9. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  10. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

随机推荐