2011-06-20 47 views
2

即时通讯试图锁定屏幕orientation在Android应用程序。我使用下面的代码来锁定屏幕方向,当点击特定的按钮时。如何在Android中显示逆向景观时锁定屏幕方向?

// Inside button click 

Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
if (display.getOrientation() == 1) { 
        setRequestedOrientation(0); 
} else if (display.getOrientation() == 0) { 
        setRequestedOrientation(1); 
} else if (display.getOrientation() == 3) { 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
} 

以上代码为横向和纵向屏幕方向,但它不工作反向景观mode.In这种情况下,始终我的活动改变它的orientation默认landscape mode.Also我注意到,当反向横向模式装置工作,display.getOrientation()总是返回3.
我该如何找到这个问题的解决方案?

回答

-1

喜如果u想锁定屏幕方向u必须设置清单文件

<activity android:configChanges="orientation|keyboardHidden" 
     android:screenOrientation="portrait" android:name=".activities.HomeActivity" 
     android:label="@string/app_name" android:theme="@style/Theme.Translucent"> 
+0

Thanx.But我需要在运行time.Also我想overrite onRetainNonConfigurationInstance()方法服务绑定。 –

+0

其实我想锁定屏幕的方向,当特定的按钮点击fire.So我dnt想添加条目manifest.Other的东西是我的上述代码工作正常的横向和纵向screens.Issue只发生在反向横向mode.In屏幕。该模式屏幕始终将其方向更改为默认横向模式。 –

-1

试试这个

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

如果u想画像

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
+1

是的。我knw this.But我想锁定屏幕时,我的屏幕在逆向景观mode.Do你knw有定向模式称为REVERSE_LANDSCAPE? –

15

我一直在处理在使用API​​ 8时遇到同样的问题。看起来像在reserseLandscape模式下,如果您拨打

getResources().getConfiguration().orientation 

Android将返回2(SCREEN_ORIENTATION_USER),它不会锁定方向。实际上,即使该值实际存在,甚至不会为ActivityInfo类定义常量SCREEN_ORIENTATION_REVERSE_LANDSCAPE。 对于我的应用我结束了创建这个方法:每当我需要锁定的方位

public void lockScreenOrientation() { 
    switch (((WindowManager) getSystemService(WINDOW_SERVICE)) 
     .getDefaultDisplay().getRotation()) { 
    case Surface.ROTATION_90: 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
     break; 
    case Surface.ROTATION_180: 
     setRequestedOrientation(9/* reversePortait */); 
     break;   
    case Surface.ROTATION_270: 
     setRequestedOrientation(8/* reverseLandscape */); 
     break; 
    default : 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    } 
} 

我把这种方法,然后我可以简单地释放它调用

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 

希望它能帮助。

+1

不错的一个!考虑到要求定向锁定的线程数量,我很惊讶你没有数十个upvotes。 –

+0

这会杀死我的用户界面:( – tricknology

+0

@tricknology请注意,这是API 8的老玩法。你使用的是什么API以及发生了什么错误? – autremoi

0

在你AndroidManifest文件,只需简单地输入下面的代码:

 android:configChanges="keyboard|orientation|keyboardHidden|screenSize" 
     android:screenOrientation="reverseLandscape" 

例如:

<activity 
     android:name="com.gaspar.slinfilipino.Quiz" 
     android:label="@string/title_activity_quiz" 
     android:configChanges="keyboard|orientation|keyboardHidden|screenSize" 
     android:screenOrientation="reverseLandscape" 
     android:parentActivityName="com.gaspar.slinfilipino.SignLanguageMenu" > 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value="com.gaspar.slinfilipino.SignLanguageMenu" /> 
    </activity> 

它适用于我。希望能帮助到你!

3
public void lockScreenOrientation() { 
    switch (((WindowManager) getSystemService(WINDOW_SERVICE)) 
     .getDefaultDisplay().getRotation()) { 
    case Surface.ROTATION_90: 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
     break; 
    case Surface.ROTATION_180: 
     setRequestedOrientation(9/* reversePortait */); 
     break;   
    case Surface.ROTATION_270: 
     setRequestedOrientation(8/* reverseLandscape */); 
     break; 
    default : 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    } 
} 

autremoi的答案为我工作,我创造了一个新的答案,因为我的名声不让我投票给他。

在我的代码的唯一区别是,我收回传感器与我试过autremoi的答案,但它杀了我的UI此另一个

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
0

。我找到了一个可以正常工作的答案,但是我发现它的组合如下:http://www.captechconsulting.com/blog/eric-miles/programmatically-locking-android-screen-orientation

和这个:getSize() giving me errors适用,并且应该适用于所有Android版本。

用它来与setRequestedOrientation(lockOrientation());

编码愉快!

private int lockOrientation(){ 
    Display display = getWindowManager().getDefaultDisplay(); 
    int rotation = display.getRotation(); 

    Point size = new Point(); 
    size.x = display.getWidth(); 
    size.y = display.getHeight(); 

    int lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 

    if (rotation == Surface.ROTATION_0 
      || rotation == Surface.ROTATION_180) { 
     // if rotation is 0 or 180 and width is greater than height, we have 
     // a tablet 
     if (size.x > size.y) { 
      if (rotation == Surface.ROTATION_0) { 
       lock = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 
      } else { 
       lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 
      } 
     } else { 
      // we have a phone 
      if (rotation == Surface.ROTATION_0) { 
       lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
      } else { 
       lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
      } 
     } 
    } else { 
     // if rotation is 90 or 270 and width is greater than height, we 
     // have a phone 
     if (size.x > size.y) { 
      if (rotation == Surface.ROTATION_90) { 
       lock = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 
      } else { 
       lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 
      } 
     } else { 
      // we have a tablet 
      if (rotation == Surface.ROTATION_90) { 
       lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
      } else { 
       lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
      } 
     } 
    } 
    return lock; 
} 
相关问题