问题标签 [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.
android - 在屏幕关闭的情况下恢复旋转数据
我在这种方法中将数据存储到“outState”:
这意味着,当活动重新启动时,在该onCreate()
方法中,我可以执行以下操作:
但是,这会导致屏幕关闭后出现问题。当屏幕关闭时,活动被终止。这意味着 onSaveInstanceState()
如果在屏幕关闭期间发生旋转,则不会调用它,并且它savedInstancestate
为 null,因为活动已完全重新启动。结果,即使设备已旋转,我的值也没有保存和恢复。
我该如何解决这个问题?
android - 每次方向改变后都会重新创建片段,无法恢复状态
更新:事实证明问题出在其他地方。感谢@Luksprog 指出我忽略的内容。
- 该项目是使用 Android Studio 的抽屉式导航模式创建的。抽屉在
NavigationDrawerFragment
类中实现。 - The fragment holding the view pager is added when a particular item in the drawer is selected. 该代码实现了我的家庭活动。
- 当屏幕旋转时,调用的
onCreate()
方法,保留最后选择的项目。NavigationDrawerFragment
- 这就是问题所在 - 在重新创建时,
NavigationDrawerFragment
将再次调用 selectItem(),这会触发我的菜单项选择处理程序。这会导致 Android 恢复 ListFragment。
这可以通过检查我的菜单选择处理程序代码中的活动菜单项来防止。
我想保留ViewPager
由于任何原因(例如方向更改)重新创建活动时的最后查看页面索引。
位于(named )ViewPager
中,它附加到一个活动。我正在使用 compat 库,所以片段是.Fragment
ListFragment
android.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
为空?如果这是预期的行为,解决我的需求的正确方法是什么,即在配置更改时保持页面索引?
应该可以使页面索引成为静态类变量,但我不确定它是否真的在解决问题,或者只是隐藏它(因为我在上面的日志中闻到了内存泄漏)。
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 个具有自己的状态和内容的适配器)。
android - “错误:不允许使用字符串类型(在 'configChanges' 处,值为 'keyboard|keyboardHidden| orien”... 在 AndroidManifest.xml
毕竟,我是 Android 的新手,我正在使用 API 10(姜饼)。
我正在用 libgdx 开发一个简单的游戏。但是我只是安装了所有东西才能开始工作,并且......在AndroidManifest.xml
这一行中:
在控制台中出现下一个错误:_
我在 Stackoverflow 中找到了这个答案,我改用 API 13 并且可以工作......但我认为应该有一个更好的解决方案,而不是因为一行代码(还有很多人仍在使用 Gingerbread )。还有另一种方法可以解决这个问题吗?
android - Fragment 能够启动在配置更改期间不中断的任务
对不起我的英语不好
这不是问题。我发布它是因为这可能对某人有帮助。我的解决方案基于几个月前放置在这里的解决方案,但后来其作者将其删除。但是他的解决方案中有几个错误,我试图修复它们。
即使您在应用程序中执行长时间执行的任务时打开另一个应用程序,然后在另一个应用程序中更改屏幕方向,并在任务完成后返回您的应用程序,我的解决方案也能正常工作。
如果您在我的解决方案中发现错误,请告诉我。
看一看:
所以每个继承者都FragmentAbleToStartTask
必须实现onTaskResult(requestCode, resultCode, result)
。In onTaskResult()
-requestCode
是传递给 的值startTask(requestCode, ...)
。请注意,这个片段只能同时执行一个任务。
的子类示例TaskNotBeInterruptedDuringConfigurationChange
:
和子类的例子FragmentAbleToStartTask
:
android - viewpager 中的方向更改后对话框为空
每次我滑动都会加载一个新页面,现在我的所有东西都先在纵向上工作,现在我正试图让它在横向和纵向上工作。但是当我旋转屏幕时NullPointerException
,我的Dialog
.
导致它在内部MainActivity
类中的函数FragmentStatePagerAdapter
:
片段内的函数:
该对话框在内部实例化onCreateView
并返回它不为空的日志。当我在onPageVisible
其中登录时,它确实会返回 null,而当我
mProgress = new ProgressDialog(getActivity());
在其中登录时,onPageVisible
它仍然会给出一个空指针,但随后会在该行上。
我真的不明白为什么它应该设置在onCreateView
.
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?
android - 如何制作自定义监听器?
我想在我的片段中创建一个监听器,当片段变得可见时它会响应。我目前在 Activity 中使用 onPageListener 来执行此操作,但这在我的情况下不起作用。我需要的是在输入片段时在 onStart 中执行我的 AsyncTask。使用 onPageListener 之前它会尝试这样做。
使用按钮,它的工作原理如下:
此代码来自我从gitHub获得的外部类
响应布尔值的侦听器已经做了不这样做的事情: if(true) { code... }
是不是当你切换到你看到viewpager已经启动Fragment的页面时它不会被调用,所以当按下按钮时它是不活动的,监听器仍然会做出反应,这就是我需要的。
android - 如何将片段重新附加到活动?
当我旋转屏幕时,片段将与活动分离。但是,我的片段中有一个侦听器,它在按下按钮后运行 asynctask。这很好用。因此,当页面更改时,我正在寻找在没有按钮的情况下直接执行相同操作的方法。
在我的 MainActivity 我有一个 onPageChangeListener 看起来像这样:
然后在我的片段中,onPageVisible 函数是这样的:
这在旋转后转到 else ,因为活动已分离
我正在谈论的监听器来自我使用gitHub的 gitHub 类 ,在我的片段中看起来像这样:
android - 如何在 Android 中更新视图状态?
我需要在配置更改时刷新TextView
( TextView
with ) 中的文本。将其状态保存在配置状态,因为它具有. 但我想更新文本(因为语言可能会改变)。id
Android
id