问题标签 [android-configchanges]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
333 浏览

android - 在屏幕关闭的情况下恢复旋转数据

我在这种方法中将数据存储到“outState”:

这意味着,当活动重新启动时,在该onCreate()方法中,我可以执行以下操作:

但是,这会导致屏幕关闭后出现问题。当屏幕关闭时,活动被终止。这意味着 onSaveInstanceState()如果在屏幕关闭期间发生旋转,则不会调用它,并且它savedInstancestate为 null,因为活动已完全重新启动。结果,即使设备已旋转,我的值也没有保存和恢复。

我该如何解决这个问题?

0 投票
5 回答
12934 浏览

android - 每次方向改变后都会重新创建片段,无法恢复状态

更新:事实证明问题出在其他地方。感谢@Luksprog 指出我忽略的内容。

  1. 该项目是使用 Android Studio 的抽屉式导航模式创建的。抽屉在NavigationDrawerFragment类中实现。
  2. The fragment holding the view pager is added when a particular item in the drawer is selected. 该代码实现了我的家庭活动。
  3. 当屏幕旋转时,调用的onCreate()方法,保留最后选择的项目。NavigationDrawerFragment
  4. 这就是问题所在 - 在重新创建时,NavigationDrawerFragment将再次调用 selectItem(),这会触发我的菜单项选择处理程序。这会导致 Android 恢复 ListFragment。

这可以通过检查我的菜单选择处理程序代码中的活动菜单项来防止。


我想保留ViewPager由于任何原因(例如方向更改)重新创建活动时的最后查看页面索引。

位于(named )ViewPager中,它附加到一个活动。我正在使用 compat 库,所以片段是.FragmentListFragmentandroid.support.v4.app.Fragment

我认为可以通过覆盖该onSaveInstanceState()方法并在文档中添加适当的逻辑来完成onCreate(),如文档中所述:

要正确处理重启,重要的是您的 Activity 通过正常的 Activity 生命周期恢复其先前的状态,在该生命周期中,Android 在销毁您的 Activity 之前调用 onSaveInstanceState() 以便您可以保存有关应用程序状态的数据。然后,您可以在 onCreate() 或 onRestoreInstanceState() 期间恢复状态。

但片段的情况似乎有所不同。ListFragment当我从这里导航到另一个活动并按下“返回”时,可以正确恢复页面索引。但是,当我旋转设备时,页面索引会丢失。

我添加了一些日志以查看问题所在。从日志中我发现,虽然onSaveInstanceState()ListFragment我称之为 ListFragment A)的调用正确,但这个特定的 Fragment 类不再显示在活动中。当方向改变并重新创建 Activity 时,Android 调用onSaveInstanceState()随后onDetach()分离此片段。然后Android 创建一个新的实例ListFragment(我称之为 ListFragment B)并将它附加到新的、旋转的活动上。此 ListFragment B 向构造函数传递了一个空savedInstanceState值,因此最后一页索引(以及 Fragment A 的 savedInstanceState 中的任何配置)丢失。

实际上,ListFragment每次屏幕旋转都会创建一个新的实例,但似乎不会破坏旧的实例。旋转设备时,我看到如下日志:

这是我旋转屏幕大约 10 次后的日志。标签中的数字是类的hashCode()。上面的行显示,onSaveInstanceState()即使onCreate()在将它们替换为最新的 (1111031048) 片段之后,仍然会调用先前创建的片段。

请注意,我没有调用setRetainInstance()片段类。事实上,我都尝试了setRetainInstance(false)setRetainInstance(true)但它并没有改变任何东西。

我在这里做错了吗?我可以理解ListFragment需要重新创建,但为什么savedInstanceState为空?如果这是预期的行为,解决我的需求的正确方法是什么,即在配置更改时保持页面索引?

应该可以使页面索引成为静态类变量,但我不确定它是否真的在解决问题,或者只是隐藏它(因为我在上面的日志中闻到了内存泄漏)。

0 投票
0 回答
191 浏览

android - 保存嵌套适配器状态(FragmentPagerAdapter + ListViewAdapter)

我的 Activity 有一个简单的 viewPager + viewPagerAdapter:

在 viewPager 的每一页中都有一个 SearchFragment。每个 SearchFragment 只有一个 ListView + listViewAdapter:

listView 的每一行都有一个按钮,用于启动另一个 Activity(YouTubePlayer,但这并不重要)。YouTube 视频播放完毕或用户单击后退按钮后,YouTubePlayer-Activity 关闭,我自己的 Activity + ViewPager + ViewPages 中的 SearchFragments + SearchFragments 中的 ListViews 再次显示。

虽然我可以恢复 - viewPager 的位置(我将它保存在 Activity 的一个字段中) - viewPager 中的 SearchFragments(参见上面的 SearchFragmentAdapter 的构造函数)

我无法恢复包含任何 ListView 的内容和滚动位置的 ListView 和 ListViewAdapter。当然,配置更改也会发生同样的情况:Activity 重新构建,可以从其字段中恢复 viewPager 的位置,但滚动位置,尤其是 SearchFragments 的内容丢失了。

设备旋转后,如何至少恢复 listViews 的内容(滚动位置只是一个不错的选择)?

我读了很多关于 viewPager 和 ListViews 的状态保存的文章,但是几乎没有关于使用这种组合保存状态的好信息(viewPager + listView = 2 个具有自己的状态和内容的适配器)。

0 投票
3 回答
12865 浏览

android - “错误:不允许使用字符串类型(在 'configChanges' 处,值为 'keyboard|keyboardHidden| orien”... 在 AndroidManifest.xml

毕竟,我是 Android 的新手,我正在使用 API 10(姜饼)。

我正在用 libgdx 开发一个简单的游戏。但是我只是安装了所有东西才能开始工作,并且......在AndroidManifest.xml这一行中:

在控制台中出现下一个错误:_

我在 Stackoverflow 中找到了这个答案,我改用 API 13 并且可以工作......但我认为应该有一个更好的解决方案,而不是因为一行代码(还有很多人仍在使用 Gingerbread )。还有另一种方法可以解决这个问题吗?

0 投票
0 回答
134 浏览

android - Fragment 能够启动在配置更改期间不中断的任务

对不起我的英语不好

这不是问题。我发布它是因为这可能对某人有帮助。我的解决方案基于几个月前放置在这里的解决方案,但后来其作者将其删除。但是他的解决方案中有几个错误,我试图修复它们。

即使您在应用程序中执行长时间执行的任务时打开另一个应用程序,然后在另一个应用程序中更改屏幕方向,并在任务完成后返回您的应用程序,我的解决方案也能正常工作。

如果您在我的解决方案中发现错误,请告诉我。

看一看:

所以每个继承者都FragmentAbleToStartTask必须实现onTaskResult(requestCode, resultCode, result)。In onTaskResult()-requestCode是传递给 的值startTask(requestCode, ...)。请注意,这个片段只能同时执行一个任务。

的子类示例TaskNotBeInterruptedDuringConfigurationChange

和子类的例子FragmentAbleToStartTask

0 投票
2 回答
222 浏览

android - viewpager 中的方向更改后对话框为空

每次我滑动都会加载一个新页面,现在我的所有东西都先在纵向上工作,现在我正试图让它在横向和纵向上工作。但是当我旋转屏幕时NullPointerException,我的Dialog.

导致它在内部MainActivity类中的函数FragmentStatePagerAdapter

片段内的函数:

该对话框在内部实例化onCreateView并返回它不为空的日志。当我在onPageVisible其中登录时,它确实会返回 null,而当我 mProgress = new ProgressDialog(getActivity());在其中登录时,onPageVisible它仍然会给出一个空指针,但随后会在该行上。

我真的不明白为什么它应该设置在onCreateView.

在此处输入图像描述

0 投票
5 回答
14837 浏览

android - Android Layout land not working

I've been looking at issues in stackoverflow and I've tried everything I've seen but the layout-land not work. In my code I have and the method onConfigurationChanged

And the manifest file:

I tried also to remove in the android manifest entry: configChanges and then the layout land load but the components i have (TextView, scrollbar ...) does not work properly.

Can you help me, please?

0 投票
1 回答
72 浏览

android - 如何制作自定义监听器?

我想在我的片段中创建一个监听器,当片段变得可见时它会响应。我目前在 Activity 中使用 onPageListener 来执行此操作,但这在我的情况下不起作用。我需要的是在输入片段时在 onStart 中执行我的 AsyncTask。使用 onPageListener 之前它会尝试这样做。

使用按钮,它的工作原理如下:

此代码来自我从gitHub获得的外部类

响应布尔值的侦听器已经做了不这样做的事情: if(true) { code... }

是不是当你切换到你看到viewpager已经启动Fragment的页面时它不会被调用,所以当按下按钮时它是不活动的,监听器仍然会做出反应,这就是我需要的。

0 投票
1 回答
628 浏览

android - 如何将片段重新附加到活动?

当我旋转屏幕时,片段将与活动分离。但是,我的片段中有一个侦听器,它在按下按钮后运行 asynctask。这很好用。因此,当页面更改时,我正在寻找在没有按钮的情况下直接执行相同操作的方法。

在我的 MainActivity 我有一个 onPageChangeListener 看起来像这样:

然后在我的片段中,onPageVisible 函数是这样的:

这在旋转后转到 else ,因为活动已分离

我正在谈论的监听器来自我使用gitHub的 gitHub 类 ,在我的片段中看起来像这样:

0 投票
1 回答
919 浏览

android - 如何在 Android 中更新视图状态?

我需要在配置更改时刷新TextView( TextViewwith ) 中的文本。将其状态保存在配置状态,因为它具有. 但我想更新文本(因为语言可能会改变)。idAndroidid