我们的QA检测到一个错误:当旋转Android设备(Droid Turbo)时,发生以下与RecyclerView相关的崩溃:
java.lang.IndexOutOfBoundsException:检测到不一致.无效的项目位置2(偏移量:2).state:3
对我来说,它看起来像RecyclerView内部的一个内部错误,因为我无法想到这是由我们的代码直接导致的任何方式......
有谁遇到过这个问题?
什么是解决方案?
一个残酷的解决方法可能是在发生异常时捕获异常并从头开始重新创建RecyclverView实例,以避免陷入损坏状态.
但是,如果可能的话,我想更好地理解这个问题(并且可能在其源头修复它),而不是掩盖它.
这个bug很难重现,但是当它发生时它是致命的.
完整的堆栈跟踪:
W/dalvikvm(7546):threadid = 1:线程退出,未捕获异常(组= 0x41987d40)E/AndroidRuntime(7546):致命异常:主E/AndroidRuntime(7546):进程:com.oblong.mezzedroid,PID:7546 E/AndroidRuntime(7546):java.lang.IndexOutOfBoundsException:检测到不一致.无效的项目位置2(偏移量:2).state:3 E/AndroidRuntime(7546):在android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java:3382)E/AndroidRuntime(7546):at android .support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java:3340)E/AndroidRuntime(7546):at android.support.v7.widget.LinearLayoutManager $ LayoutState.next(LinearLayoutManager.java:1810)E/AndroidRuntime (7546):在android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1306)E/AndroidRuntime(7546):在android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1269)E/AndroidRuntime(7546):在android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:523)E/AndroidRuntime(7546):at org.liboid.recycler_view.RecyclerViewContainer $ LiLinearLayoutManager.onLayoutChildren(RecyclerViewContainer.java:179 )E/AndroidRuntime(7546):在android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:1942))E/AndroidRuntime(7546):在android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:2237)E/AndroidRuntime(7546):at org.liboid.recycler_view.LiRecyclerView.onLayout(LiRecyclerView.java:30) )E/AndroidRuntime(7546):在android.view.View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546) ):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)E/AndroidRuntime(7546):在android.widget.FrameLayout.onLayout(FrameLayout.java:388)E/AndroidRuntime(7546):在android.view .View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546):在android.widget.FrameLayout.layoutChildren(FrameLayout) .java:453)E/AndroidRuntime(7546):在android.widget.FrameLayout.onLayout(FrameLayout.java:388)E/AndroidRuntime(7546):在android.view.View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546):在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)E/AndroidRuntime(7546):在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)E/AndroidRuntime( 7546):在android.widget.LinearLayout.onLayout(LinearLayout.java:1434)E/AndroidRuntime(7546):at com.oblong.mezzedroid.workspace.content.bins.BinsContainerLayout.onLayout(BinsContainerLayout.java:22)E/AndroidRuntime(7546):在android.view.View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546):at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)E/AndroidRuntime(7546):在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)E/AndroidRuntime(7546):在android.widget.LinearLayout. onLayout(LinearLayout.java:1434)E/AndroidRuntime(7546):在android.view.View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java: 4651)E/Android 运行时(7546):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)E/AndroidRuntime(7546):在android.widget.FrameLayout.onLayout(FrameLayout.java:388)E/AndroidRuntime(7546):at android.view.View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546):在android.widget.FrameLayout. layoutChildren(FrameLayout.java:453)E/AndroidRuntime(7546):在android.widget.FrameLayout.onLayout(FrameLayout.java:388)E/AndroidRuntime(7546):在android.view.View.layout(View.java: 14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546):在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)E/AndroidRuntime( 7546):在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)E/AndroidRuntime(7546):在android.widget.LinearLayout.onLayout(LinearLayout.java:1434)E/AndroidRuntime(7546):在android. view.View.layout(View.java:14946)E/Andro idRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)E/AndroidRuntime(7546):at android.widget.FrameLayout.onLayout(FrameLayout.java:388)E/AndroidRuntime(7546):在android.view.View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup. layout(ViewGroup.java:4651)E/AndroidRuntime(7546):在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)E/AndroidRuntime(7546):在android.widget.LinearLayout.layoutVertical(LinearLayout.java: 1525)E/AndroidRuntime(7546):在android.widget.LinearLayout.onLayout(LinearLayout.java:1434)E/AndroidRuntime(7546):在android.view.View.layout(View.java:14946)E/AndroidRuntime( 7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime(7546):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)E/AndroidRuntime(7546):在android. widget.FrameLayout.onLayout(FrameLayout.java:3 88)E/AndroidRuntime(7546):在android.view.View.layout(View.java:14946)E/AndroidRuntime(7546):在android.view.ViewGroup.layout(ViewGroup.java:4651)E/AndroidRuntime( 7546):在android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2132)E/AndroidRuntime(7546):在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1872)E/AndroidRuntime(7546):at andro
我读了很多关于如何保存我的实例状态或如何在屏幕旋转期间处理我的活动被破坏的内容.
似乎有很多可能性,但我还没有想出哪一个最适合检索AsyncTask的结果.
我有一些AsyncTasks只是再次启动并调用isFinishing()活动的方法,如果活动正在完成,他们不会更新任何东西.
问题是我有一个任务对Web服务发出请求失败或成功的任务,并且重新启动任务会导致用户的经济损失.
你怎么解决这个问题?可能的解决方案有哪些优点或缺点?
我有一个ArrayList自定义对象,我希望能够在屏幕上保存和恢复旋转.
我知道,这是可以做到的onSaveInstanceState和onRestoreInstanceState如果我让ArrayList自己的类,它实现了无论是Parcelable还是Serializable......但是,有没有办法做到这一点,而无需创建另一个类?
我在Honeycomb开发了一个应用程序,我正在使用片段.
这是我的应用程序
我的问题是什么
当用户旋转设备时,重新创建活动并使F1成为片段对象,即使在旋转之前它不是
我使用但它对我不起作用
我已经在我的函数中添加了代码片段,就像这样
What is the way to retain the fragment object while rotating?setRetainInstance(true);onCreate
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
Fragment homeFragment = new Home();
fragmentTransaction.add(R.id.mainFragement, homeFragment);
fragmentTransaction.commit();
}
Run Code Online (Sandbox Code Playgroud) android screen-rotation android-fragments android-3.0-honeycomb
我有一个非常简单的应用程序: - 只允许屏幕上的按钮允许所有方向 - 按钮显示UIImagePickerController(拍照) - 使用Xcode 5和SDK 7构建
在iOS 8上,UIImagePickerController无论我是横向还是纵向,相机都正确显示,但是当我旋转设备时,我将相机视图旋转了90度,这是一个例子:
UIImagePickerController
视图是横向的,但相机旋转了90度
其他人是否已经遇到过此问题?
PS:如果我拍照(再次在风景中),照片正确拍摄并现在正确显示:

编辑
这个错误似乎在运行iOS 8.1的iPad上修复,但似乎没有任何与iOS 8.1发行说明中的错误相关的内容:https://developer.apple.com/library/content/releasenotes/General/RN-iOSSDK-8.1/
感谢所有早期版本的iOS 8的修复程序!
objective-c uiimagepickercontroller screen-rotation ios ios8
我在iOS 6 SDK中遇到了这个问题:我有一些应该被允许轮换的视图(例如视频视图),而有些则不允许.现在我明白我必须检查应用程序的Info.plist中的所有方向,然后在每个ViewController中进行排序,应该发生什么.但它不起作用!应用程序始终旋转到Info.plist中给出的方向.
Info.plist的:
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
Run Code Online (Sandbox Code Playgroud)
任何不允许旋转的ViewController:
//deprecated
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
Run Code Online (Sandbox Code Playgroud)
观察:App旋转到横向和纵向.任何想法为什么或我做错了什么?
干杯,马克
编辑:我的最新调查结果还表明,如果您希望在应用程序中的某个位置进行旋转,则必须激活项目设置或Info.plist中的所有四个旋转方向.替代方法是覆盖
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
Run Code Online (Sandbox Code Playgroud)
在你的AppDelegate中,它会覆盖Info.plist.不再可能只在Info.plist中设置Portrait,然后通过覆盖shouldAutorotateToInterfaceOrientation或supportedInterfaceOrientations在某些ViewController中进行旋转.
我昨天开始研究PhoneGap并在倾斜手机的同时创造了一个简单的"大理石".我目前正在使用Android进行开发,但我希望这种方向可以保持美化,而不是在手机旋转时移动.有办法做到这一点吗?
表现:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.phonegap.helloworld"
android:versionCode="1"
android:versionName="1.0" >
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:resizeable="true"
android:anyDensity="true"
/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-sdk android:minSdkVersion="8" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".App"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name" >
<intent-filter>
<action …Run Code Online (Sandbox Code Playgroud) 我有这个应用程序,我正在努力,我需要所有的视图控制器,但一个是肖像.单一的视图控制器是特殊的我需要它能够旋转到手机的任何方向.
为此,我以模态方式呈现它(未嵌入NavigationController中)
所以(例如)我的结构是这样的:
现在,当我在横向位置解除模态视图控制器时,我的父视图控制器也会旋转,即使它不支持该方向.
应用程序中的所有UIViewControllers和UINavigaionControllers继承自实现这些方法的相同通用类:
override func supportedInterfaceOrientations() -> Int
{
return Int(UIInterfaceOrientationMask.Portrait.toRaw())
}
Run Code Online (Sandbox Code Playgroud)
我的模态视图控制器再次覆盖此方法,它看起来像这样:
override func supportedInterfaceOrientations() -> Int
{
return Int(UIInterfaceOrientationMask.All.toRaw())
}
Run Code Online (Sandbox Code Playgroud)
更新1
看起来这只发生在iOS8 Beta上.有人知道视图控制器的轮换是否有变化,或者这只是测试版中的错误?
我有一个UIViewController中包含的UIWebView,它是UINavigationController的后代.它看起来像这样:

该应用程序仅限肖像.当我播放视频时,我希望用户能够旋转设备并以横向模式观看视频.我使用这段代码来允许它:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
id presentedViewController = [self topMostController];
NSString *className = presentedViewController ? NSStringFromClass([presentedViewController class]) : nil;
if ([className isEqualToString:@"MPInlineVideoFullscreenViewController"] ||
[className isEqualToString:@"MPMoviePlayerViewController"] ||
[className isEqualToString:@"AVFullScreenViewController"]) {
return UIInterfaceOrientationMaskAllButUpsideDown;
}
return UIInterfaceOrientationMaskPortrait;
}
- (UIViewController *)topMostController {
UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;
while (topController.presentedViewController) {
topController = topController.presentedViewController;
}
return topController;
}
Run Code Online (Sandbox Code Playgroud)
然后在我的UINavigationController中(所以当视频完成后,视图不会以横向呈现,只能以纵向呈现):
- (BOOL)shouldAutorotate
{
return NO;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationPortrait;
}
Run Code Online (Sandbox Code Playgroud)
一切都很完美:

但是视频完成播放(或者用户点击'完成')并且屏幕返回到底层视图,这是发生的事情:

如您所见,导航栏在状态栏下滑动.另外,我在日志中遇到了很多自动布局错误:http …
objective-c uiwebview uinavigationcontroller screen-rotation ios
随着Xcode 6的推出,Apple取消了在Universal应用程序中轻松拥有iPad和iPhone多个故事板的功能.因此,您无法在旋转面板/设置上区分iPad和iPhone.
如何阻止iPhone应用程序旋转到横向,同时仍然允许iPad应用程序这样做.
这是你只能在代码中做的事吗?如果是,我仍然使用Objective C,而不是Swift.