我的主要活动有一些代码,可以进行一些不应该被中断的数据库更改.我正在另一个线程中进行繁重的工作,并使用我设置为不可取消的进度对话框.但是,我注意到如果我旋转手机,它会重新启动对正在运行的进程非常不好的活动,并且我会收到强制关闭.
我想要做的是以编程方式禁用屏幕方向更改,直到我的进程完成,此时方向更改已启用.
我想在我的偏好Activity中创建复选框,允许用户切换方向更改.
在类似的问题中,人们只编写完整的方向锁(通过覆盖onConfigurationChanged方法或在AndroidManifest.xml中添加configChanges)或方向强制(通过setRequestedOrientation).
有没有办法切换方向锁?
编辑:我创建了一个方法,将首选方向设置为三种状态之一:横向,纵向和传感器.此方法与检索方向getResources().getConfiguration().orientation)和将检索到的方向保存到首选项一起使用.然后在需要锁定方向的活动中,我使用首选项的首选方向来激活此方法.
private static void setActivityOrientation(Activity activity, int preferenceOrientation) {
if (preferenceOrientation == Configuration.ORIENTATION_LANDSCAPE) {
if( activity.getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
// You need to check if your desired orientation isn't already set because setting orientation restarts your Activity which takes long
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
} else if (preferenceOrientation == Configuration.ORIENTATION_PORTRAIT) {
if( activity.getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
} else {
if( activity.getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_SENSOR){
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我使用以下代码为每个用户首选项设置方向锁定:
private void doLock(boolean locked) {
if (locked) {
int o = getResources().getConfiguration().orientation;
if (o == Configuration.ORIENTATION_LANDSCAPE)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
else if (o == Configuration.ORIENTATION_PORTRAIT)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
}
Run Code Online (Sandbox Code Playgroud)
它的工作原理,除了我处于解锁模式(SCREEN_ORIENTATION_SENSOR)的情况下屏幕显示LANDSCAPE正确(!),然后调用doLock(true)和...
而不是屏幕锁定到LANDSCAPE其当前(正确)横向视图,它锁定到倒置的横向视图.即同样精确但垂直翻转(y变为-y).
为什么这样,我如何处理这个问题才能解决它?
我的初步调查显示除了常见的两个(,)之外还有很多其他可能性,包括,但是我的预感告诉我这个问题可能取决于设备,所以通过使用它我可能只是为我的手机修复问题但不适用于所有其他设备.portraitlandscapereverseLandscape
有没有办法在所有设备中强制正确landscape定位(切换时sensor)?
为了使这更清晰,更容易重现,以下是显示问题的步骤:
SCREEN_ORIENTATION_SENSOR),屏幕显示LANDSCAPE正确(!),doLock(true)LANDSCAPE当前(正确)的横向视图中,而是锁定到倒置的横向视图.即同样精确但垂直翻转(y变为-y).好吧,我正在尝试添加锁定方向按钮,但是当我打电话时
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
Run Code Online (Sandbox Code Playgroud)
屏幕变为普通人像.我究竟做错了什么?
public void onSensorChanged(SensorEvent event) {
x = event.values[0];
y = event.values[1];
z = event.values[2];
orientation.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if (x > 5){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else if (x < -5){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
} else if (y > 5){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else if (y < -5){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
}
}
});
}
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我有一个自定义AlertDialog(由系统使用showDialog()处理),其中包含一个带有2个选项卡的tabhost.其中一个标签是一个旋转器.只要微调器未打开(显示微调器对话框),我就可以毫无问题地旋转屏幕.如果在旋转过程中旋转器是打开的,我会得到:
FATAL EXCEPTION: main
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:200)
at android.view.Window$LocalWindowManager.removeView(Window.java:432)
at android.app.Dialog.dismissDialog(Dialog.java:278)
at android.app.Dialog.access$000(Dialog.java:71)
at android.app.Dialog$1.run(Dialog.java:111)
at android.app.Dialog.dismiss(Dialog.java:268)
at android.widget.Spinner.onDetachedFromWindow(Spinner.java:89)
at android.view.View.dispatchDetachedFromWindow(View.java:6173)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1164)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162)
at android.view.ViewRoot.dispatchDetachedFromWindow(ViewRoot.java:1746)
at android.view.ViewRoot.doDie(ViewRoot.java:2757)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1995)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
所以...
1 - …
请注意:这个问题是关于Qt C ++框架的,而不是普通的Java API。在Java中,此问题已得到解答。
在我的应用程序的主菜单中,我真的不想担心不同类型的屏幕旋转。我想禁用屏幕旋转,直到用户转到屏幕旋转有意义的其他视图为止。对于主菜单,我只想使用纵向视图。
如何实现呢?如何控制应用程序屏幕旋转?
我试图暂时锁定Android设备的方向,大多数情况下它会随着传感器的变化而变化.所以我想要做的是弄清楚当前的方向(横向,反向横向,纵向,反向肖像)是什么,将方向更改为该方向,然后将其更改回原来的方向.
我知道我可以使用诸如int orientation = this.getResources().getConfiguration().orientation等代码.this.setRequestedOrientation(取向); 这个问题通常是所讨论的方向被设置为"未定义"或者可能是"用户"或"传感器",这对我没有帮助.如何找出屏幕四个可能的哪一侧"向下"?
我知道getRotation(),如下所述:如何检测android设备的方向?
问题是我可以从设备的"自然"方向找出实际旋转(0度,90度,180度,270度)......但如果我不知道原始方向是什么,这对我没有帮助是.
如何找出设备的转向方式,以便暂时将设备固定到该方向?
不,这不是一个重复的问题.我怀疑在不同的设备上可能会有不同的行为,但不能确定.我做了更多的实验和研究.我原因认为getConfiguration().orientation返回"未指定".我误解了.它确实返回横向或纵向.
但这是问题所在.直到Gingerbread(2.3,API 9)才添加了REVERSE风景和逆向肖像.
因此,如果设备处于反向横向模式,例如,getConfiguration.orientation会告诉我它处于横向模式.然后,当我将所请求的方向设置为landscape-bam时,屏幕会颠倒翻转.
我没有意识到这在Froyo中更难,所以我将重新解释我之前拼写的问题:
在Froyo中,如何检测设备是横向,反向横向,纵向还是反向纵向?
建议列出所有工作 - 姜饼或更高.