android屏幕方向:仅锁定部分布局

时间:2012-12-18 14:39:24

标签: android android-layout

我正在构建一个使用相机预览的相机应用程序。为了使用全屏进行预览,我用

锁定了活动
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

现在我遇到以下问题:无论何时渲染表格或我必须显示对话框,它总是以横向模式显示,即使用户在纵向模式下使用他/她的设备也是如此。 我试图通过使用变换动画来旋转edittext视图,并且它们被正确旋转,但我仍然无法再将它们聚焦,并且键盘也始终显示在横向中:(

你知道在这里寻找方法吗?

重要提示:检测方向不是问题所在。问题是:如何以仍然可用的方式旋转表单/视图/视图组和键盘。

我知道它必须以某种方式成为可能:三星的相机应用程序(与星系S3一起提供)能够在不旋转预览的情况下旋转视图,因此它必须是可能的! 见:

http://www.letsgomobile.org/images/reviews/0186/galaxy-s3-camera.jpg

http://cdn2.mos.techradar.futurecdn.net//art/mobile_phones/Samsung/GalaxyS3/Galaxy%20Fire/Samsung_Galaxy_S3_25-580-100.JPG

6 个答案:

答案 0 :(得分:2)

通过设置此属性

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

您只是将屏幕锁定到LANDSCAPE,此后即使用户在纵向模式下按住设备,也不会将其旋转到纵向模式。根据我对你的问题的理解,你可以做一件事。

android:configChanges="orientation"

在menifest文件中,将以上属性添加到您的Activity中。并且在Activity类中覆盖onConfigurationChange方法,您可以根据需要处理方向更改,而不是将Activity锁定到Landscape。

如果我以正确的方式理解您的问题,那么它可能会对您有所帮助。

答案 1 :(得分:2)

三星相机应用程序正在使用方向更改侦听器和方向传感器。如果用户从设置中阻止设备旋转,则旋转仍然会发生。

您需要创建完整的自定义小部件,因此无法在Dialog中使用build,您必须显示CustomDialog ....

基本思想是使用OrientationEventListener和SensorManager。在“设备旋转”中,您必须更新UI并使用新方向旋转视图。以下是使用OrientationEventListener How to use OrientationEventListener的教程 在大多数相机应用程序上,活动仍然在LANDSCAPE上被阻止。 所有相机应用程序都可以通过旋转轻松处理SurfaceView尺寸变化。

答案 2 :(得分:0)

您必须通过旋转设备来覆盖活动的行为,您必须在mafinest中添加orientationChange,然后为此事件添加侦听器并手动旋转视图。

如果您使用此方法,所有对话框等(系统视图)将以正确的方式显示。

检查一下: http://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges

这个: How to handle screen orientation change when progress dialog and background thread active? (我认为第二个答案)

答案 3 :(得分:0)

您最好尝试将另一个活动用作对话框并在清单中设置其属性(方向和主题)并使用它。

答案 4 :(得分:0)

在您的清单文件中,为您的相机预览活动提供以下属性 android:configChanges="keyboardHidden|orientation"更多阅读this

<activity
        android:name=".Your_Activity_Name"
        android:configChanges="keyboardHidden|orientation"
        android:label="@string/app_name" >
        <intent-filter>
            <!-- Your filter attributes if any. -->
        </intent-filter>
    </activity>

在您的活动类中覆盖onConfigurationChanged&amp;在需要的屏幕方向模式(例如,风景或肖像)中做这样的需要(根据你的需要)_

@Override
 public void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);

     // Checks the orientation of the screen
     if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
         Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        //Your code to do the other things in landscape mode...

     } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
         Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
       //Your code to do the other things in portrait mode...

     }
 }

我希望这可以帮助你摆脱你的问题。

答案 5 :(得分:0)

afaik:通过捕捉方向事件来实现轮换 并根据该方向使用新布局为屏幕充气。

  1. 在风景中膨胀
  2. 发生
  3. 旋转
  4. 为要更改的屏幕部分充气 例如,我们使用纵向按钮的新布局而不是横向来为按钮的持有者视图充气。
  5. 您必须将布局切割成在运行时一起添加的部分。

    实现此目的的另一种方法是使用表面视图进行相机预览,并使用其他布局来保持表面并使用framelayout

    添加表面。