Android:暂时禁用活动中的方向更改

Chr*_*rry 113 android screen-orientation android-orientation

我的主要活动有一些代码,可以进行一些不应该被中断的数据库更改.我正在另一个线程中进行繁重的工作,并使用我设置为不可取消的进度对话框.但是,我注意到如果我旋转手机,它会重新启动对正在运行的进程非常不好的活动,并且我会收到强制关闭.

我想要做的是以编程方式禁用屏幕方向更改,直到我的进程完成,此时方向更改已启用.

Kev*_*din 161

正如克里斯在他的自我回答中所说,打电话

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
Run Code Online (Sandbox Code Playgroud)

然后

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
Run Code Online (Sandbox Code Playgroud)

在真实的设备上真的像魅力一样!

在仿真器上进行测试时,不要认为它已损坏,ctrl + F11快捷方式始终改变屏幕方向,而不模拟传感器移动.

编辑:这不是最好的答案.正如评论中所解释的,这种方法存在问题.真正的答案就在这里.

  • 这些方法存在问题......看起来如果调用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 当设备未处于默认方向使用状态时,活动方向会立即更改(销毁并重新创建)到设备默认方向.例如,在手机上,如果以横向方向握住它,则在重新激活传感器时,活动将切换为纵向并返回到横向.与Archos A5 IT相同的相反问题:在纵向中使用它会导致活动切换到横向并返回到纵向. (40认同)
  • 这不适合我.这个工作虽然有效:http://stackoverflow.com/a/10488012/1369016我不得不调用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 或setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 基于从getResources().getConfiguration().orientation中检索的当前方向. (2认同)

Pil*_*_51 41

没有其他答案对我来说完美无缺,但这就是我发现的.

锁定方向为当前......

if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Run Code Online (Sandbox Code Playgroud)

当应该再次允许更改方向时,请设置回默认值...

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
Run Code Online (Sandbox Code Playgroud)

  • 这个问题是`Configuration.ORIENTATION_PORTRAIT`将以两种横向模式返回(即'正常'和反转).因此,如果手机处于反向横向方向并且您将其设置为"ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE",它将颠倒翻转.在API 9中,ActivityInfo引入了`SCREEN_ORIENTATION_REVERSE_LANDSCAPE`常量,但我没有看到通过`Configuration`类检测这种方向的方法. (9认同)

小智 37

这是一个更加完整和最新的解决方案,适用于API 8+,适用于反向纵向和横向,并适用于Galaxy选项卡,其中"自然"方向是横向(调用activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)解锁方向):

@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
public static void lockActivityOrientation(Activity activity) {
    Display display = activity.getWindowManager().getDefaultDisplay();
    int rotation = display.getRotation();
    int height;
    int width;
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) {
        height = display.getHeight();
        width = display.getWidth();
    } else {
        Point size = new Point();
        display.getSize(size);
        height = size.y;
        width = size.x;
    }
    switch (rotation) {
    case Surface.ROTATION_90:
        if (width > height)
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        else
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        break;
    case Surface.ROTATION_180:
        if (height > width)
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        else
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
        break;          
    case Surface.ROTATION_270:
        if (width > height)
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
        else
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        break;
    default :
        if (height > width)
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        else
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
}
Run Code Online (Sandbox Code Playgroud)


Iva*_*ART 17

为了管理反向方向模式,我使用该代码来修复活动方向:

int rotation = getWindowManager().getDefaultDisplay().getRotation();

    switch(rotation) {
    case Surface.ROTATION_180:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        break;
    case Surface.ROTATION_270:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);         
        break;
    case  Surface.ROTATION_0:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        break;
    case Surface.ROTATION_90:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        break;
    }
Run Code Online (Sandbox Code Playgroud)

并再次允许方向:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是实现这一目标的正确方法 (3认同)

Sud*_*nha 16

使用 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);用于锁定当前的方向,无论是横向还是纵向.

使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);解锁方向.

  • 适用于Build.VERSION.SDK_INT> = 18,更完整的答案由tdjprog在此页面中给出/sf/answers/2926908001/ (2认同)

Chr*_*rry 14

我找到了答案.为此,在一个Activity中,您可以setRequestedOrientation(int)使用此处指定的值之一调用:http://developer.android.com/reference/android/R.attr.html#screenOrientation

在我开始我的线程之前,我打电话setRequestedOrientation(OFF)(OFF = nosensor),当线程完成后我调用setRequestedOrientation(ON)(ON =传感器).奇迹般有效.


Pro*_*man 10

谢谢大家.我修改了Pilot_51的解决方案,以确保我恢复到以前的状态.我还投入了一个更改,以支持非横向和非纵向屏幕(但没有在这样的屏幕上测试它).

prevOrientation = getRequestedOrientation();
if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
}
Run Code Online (Sandbox Code Playgroud)

然后恢复它

setRequestedOrientation(prevOrientation);
Run Code Online (Sandbox Code Playgroud)


tdj*_*rog 8

protected void setLockScreenOrientation(boolean lock) {
    if (Build.VERSION.SDK_INT >= 18) {
        setRequestedOrientation(lock?ActivityInfo.SCREEN_ORIENTATION_LOCKED:ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
        return;
    }

    if (lock) {
        switch (getWindowManager().getDefaultDisplay().getRotation()) {
            case 0: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); break; // value 1
            case 2: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); break; // value 9
            case 1: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; // value 0
            case 3: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); break; // value 8
        }
    } else
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); // value 10
}
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案! (2认同)

Adr*_*det 6

这是一个每次都能工作并保留当前方向的解决方案(Activity.Info.SCREEN_ORIENTATION_PORTRAIT例如,使用设置为0°,但用户可以将180°方向作为当前方向).

// Scope: Activity

private void _lockOrientation() {
    if (super.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT);
    } else {
        super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE);
    }
}

private void _unlockOrientation() {
    super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是:仅限API 18+ (2认同)