我正在构建一个使用相机预览的相机应用程序。为了使用全屏进行预览,我用
锁定了活动setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
现在我遇到以下问题:无论何时渲染表格或我必须显示对话框,它总是以横向模式显示,即使用户在纵向模式下使用他/她的设备也是如此。 我试图通过使用变换动画来旋转edittext视图,并且它们被正确旋转,但我仍然无法再将它们聚焦,并且键盘也始终显示在横向中:(
你知道在这里寻找方法吗?
重要提示:检测方向不是问题所在。问题是:如何以仍然可用的方式旋转表单/视图/视图组和键盘。
我知道它必须以某种方式成为可能:三星的相机应用程序(与星系S3一起提供)能够在不旋转预览的情况下旋转视图,因此它必须是可能的! 见:
http://www.letsgomobile.org/images/reviews/0186/galaxy-s3-camera.jpg
答案 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:通过捕捉方向事件来实现轮换 并根据该方向使用新布局为屏幕充气。
您必须将布局切割成在运行时一起添加的部分。
实现此目的的另一种方法是使用表面视图进行相机预览,并使用其他布局来保持表面并使用framelayout
添加表面。