标签: android-orientation

在两侧设置android的横向方向

我在2.2中的Android应用程序中工作,我想在landscape模式下设置我的应用程序.

为此,我在manifest每个活动标签中 添加了android:screenOrientation="landscape"它,并且工作正常.

但它只出现在一方.如果我再次颠倒设备,它会在landscape模式下适合相同的位置.如何在设备的两侧都具有横向模式.请帮我.

提前致谢.

android android-orientation

15
推荐指数
2
解决办法
2万
查看次数

最佳方式:在ScrollView中保存并恢复TextView位置

我想要的是,在设备更改方向时,屏幕中的顶线在纵向时仍然是横向屏幕上的顶行.反之亦然.

由于纵向和横向之间的屏幕宽度可能不同,因此文本的线宽(也就是宽度TextView和宽度ScrollView)会有所不同.因此,在不同的屏幕配置(纵向与横向,大与小)中,换行将有所不同.在不同的情况下,换行符将处于不同的位置.

有三种不太完美的解决方案供您参考.还解释了它们的缺点.


首先,最基本的方法:

(1)仅将y偏移存储在像素中

请查看:http://eliasbland.wordpress.com/2011/07/28/how-to-save-the-position-of-a-scrollview-when-the-orientation-changes-in-android/

为什么这不是那么完美:

在肖像中,线条被包裹.

Line_1_Word_A Line_1_Word_B Line_1_Word_C
Line_1_Word_D
Line_2_Word_A Line_2_Word_B Line_2_Word_C
Line_2_Word_D
Line_3_Word_A Line_3_Word_B Line_3_Word_C
Line_3_Word_D
Run Code Online (Sandbox Code Playgroud)

在横向中,线条不会被包裹.

Line_1_Word_A Line_1_Word_B Line_1_Word_C Line_1_Word_D
Line_2_Word_A Line_2_Word_B Line_2_Word_C Line_2_Word_D
Line_3_Word_A Line_3_Word_B Line_3_Word_C Line_3_Word_D
Run Code Online (Sandbox Code Playgroud)

想象一下Line_2_Word_A在保存时在Portrait中读取(在屏幕顶部).当更改为横向时,它将显示Line_3_Word_A(在屏幕顶部).(因为顶部有两行偏移的像素.)


然后我想出一个方法,

(2)通过保存滚动百分比

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    final ScrollView scrollView = (ScrollView) findViewById(R.id.Trial_C_ScrollViewContainer);
    outState.putFloatArray(ScrollViewContainerScrollPercentage,
            new float[]{
            (float) scrollView.getScrollX()/scrollView.getChildAt(0).getWidth(),
            (float) scrollView.getScrollY()/scrollView.getChildAt(0).getHeight() });
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) { …
Run Code Online (Sandbox Code Playgroud)

android textview android-layout android-scrollview android-orientation

15
推荐指数
1
解决办法
5642
查看次数

如何在不重新创建布局的情况下旋转方向更改视图?

这个问题在之前已经被问过,但答案是不正确的.我想在屏幕方向更改上旋转一些视图,但我想保持布局不变.它们应该根据当前定向(旋转90度,180度270或360度SCREEN_ORIENTATION_LANDSCAPE,SCREEN_ORIENTATION_PORTRAIT,SCREEN_ORIENTATION_REVERSE_LANDSCAPE,SCREEN_ORIENTATION_REVERSE_PORTRAIT).

这就是我想要实现的目标:

LayoutExample

我提到的链接中的答案表明我应该创建一个新的不同布局layout-land.显然,这不是我想要的.我不想重新创建活动或更改布局方向.我只想旋转一些视图,并保持其他视图在方向更改时保持不变.

旋转特定视图与更改或重新创建整个布局(两者都在方向更改)之间存在巨大差异.

使用此链接中的答案,我将能够使用此方法获取当前屏幕方向:

public static int getScreenOrientation(Context context) {
    WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    int rotation = windowManager.getDefaultDisplay().getRotation();
    DisplayMetrics dm = new DisplayMetrics();
    windowManager.getDefaultDisplay().getMetrics(dm);
    int width = dm.widthPixels;
    int height = dm.heightPixels;
    int orientation;
    // if the device's natural orientation is portrait:
    if ((rotation == Surface.ROTATION_0
            || rotation == Surface.ROTATION_180) && height > width ||
            (rotation == Surface.ROTATION_90
                    || …
Run Code Online (Sandbox Code Playgroud)

android rotation android-layout android-button android-orientation

15
推荐指数
1
解决办法
1万
查看次数

Android方向更改调用onCreate

我创建了一个搜索屏幕,其中包含一个用于关键字,过滤器和搜索按钮的选项卡,以及三个用于不同类型结果的可选选项卡(每个包含一个ListView带有a ArrayAdapter).启动活动时,Parcelable[]如果已执行搜索,开发人员可以选择将结果作为额外内容传递.在onCreate()方法中,我正在创建Parcelable[]传递的三个选项卡中的每一个.

当我从过滤器选项卡上的按钮调用搜索时,我清除选项卡并使用新结果重新创建它们,这非常有效.问题是,当您旋转设备时,Android的自动方向切换支持似乎会重新创建整个活动,即调用onCreate().这意味着我的搜索结果将重置为Parcelable[]启动活动时传递的内容.

到目前为止,我唯一的解决方案就是调用finish()然后startActivity()用新结果重新启动活动.我确信必须有一个更简单的解决方案,而且我做了一些非常无趣的事情.

有一个更好的方法吗?

android android-orientation android-activity

14
推荐指数
2
解决办法
2万
查看次数

Android片段在方向更改时重新创建

我正在开发一个基本上有ActionBar的应用程序.当我的应用程序启动时,Activity会创建片段并将它们附加到每个选项卡,因此当我切换时,我会得到不同的视图.

当我尝试旋转设备时出现问题.经过一番努力,我注意到Android会自动重新创建以前添加的片段,如下所示:

SummaryFragment.onCreate(Bundle) line: 79   
FragmentManagerImpl.moveToState(Fragment, int, int, int) line: 795  
FragmentManagerImpl.moveToState(int, int, int, boolean) line: 1032  
FragmentManagerImpl.moveToState(int, boolean) line: 1014    
FragmentManagerImpl.dispatchCreate() line: 1761 
DashboardActivity(Activity).onCreate(Bundle) line: 864  
...
Run Code Online (Sandbox Code Playgroud)

然后像往常一样重新创建片段.因此,我希望能够正常工作的"真实"片段以及使我的应用程序崩溃的"隐藏"Android创建的对应物.我该如何避免这种行为?我已经尝试在SummaryFragment中调用setRetainInstance(false).

谢谢

android android-fragments android-orientation

14
推荐指数
1
解决办法
2万
查看次数

OpenCV相机定位问题

我有一个简单的项目,只用org.opencv.android.JavaCameraView显示相机.

我的问题是,默认情况下,相机处于横向模式,我无法更改此原因,我需要定义CameraBridgeViewBase而不是常规的相机意图.

这是我的代码的一部分:

XML代码:

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <org.opencv.android.JavaCameraView
                android:layout_width="fill_parent"
                android:layout_height="300dp"
                android:visibility="gone"
                android:id="@+id/HelloOpenCvView"
                opencv:show_fps="true"
                opencv:camera_id="1" />


        </LinearLayout>  

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >


            <Button
                android:id="@+id/BtnVideo"
                android:layout_marginLeft="2dp"
                android:layout_marginRight="2dp"                    
                android:layout_width="0dp"
                style="@style/button"
                android:layout_height="wrap_content"
                android:layout_weight="1.00"
                android:text="@string/videoBtn"
                android:textSize="18dip" />


        </LinearLayout>   
Run Code Online (Sandbox Code Playgroud)

Java代码:

 CameraBridgeViewBase mOpenCvCameraView;
    Button VideoButton;
 protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        overridePendingTransition(0, 0);

        VideoButton = (Button) this.findViewById(R.id.BtnVideo);

        VideoButton.setOnClickListener(onClickListener);

        mOpenCvCameraView= (CameraBridgeViewBase) findViewById(R.id.HelloOpenCvView);
        mOpenCvCameraView.setVisibility(SurfaceView.INVISIBLE);

    } 

        private OnClickListener onClickListener = new OnClickListener() {

            @Override
            public void onClick(View v) {
                    switch (v.getId()){

                        case R.id.BtnVideo:
                            if(mOpenCvCameraView.getVisibility() == SurfaceView.VISIBLE)
                            {
                                mOpenCvCameraView.setVisibility(SurfaceView.INVISIBLE);
                            } …
Run Code Online (Sandbox Code Playgroud)

android opencv android-orientation

14
推荐指数
4
解决办法
3万
查看次数

更改方向的单活动应用中的YouTubePlayerSupportFragment

我试图解决这个问题,通过互联网搜索,没有找到真正的答案.

我正在开发一款需要YouTube播放器的应用.这个玩家是YouTubePlayerSupportFragment因为它在一个支持片段中(所以它也是嵌套的).初始设置后,我意识到无论何时旋转手机,视频都会停止播放,必须重新启动.这显然不是我想要的.

然后我发现了一些SO答案(就像这样),人们说Activity需要处理配置更改,所以我android:configChanges="keyboardHidden|orientation|screenSize"在清单中添加了Activity.这解决了这个问题,视频现在即使在方向改变时也能继续播放,全屏旋转看起来并不难看.很酷,我说,只是意识到这大大困扰了应用程序的其他部分,因为配置现在正在所有视图到位更新.这意味着如果我的手机处于纵向模式并且我将其旋转到横向,则使用的布局仍然是纵向布局.

我找到了解决方案,建议调用setContentView(...)Activity onConfigurationChanged(...)并重新填充片段中的视图,但这似乎是一个相当麻烦的解决方案,因为它不仅仅是我需要的简单内容设置,需要保留片段(例如滚动)在...中的位置RecyclerView.setRetainInstance(true)在这种情况下,内置功能不起作用,因为视图也可以使用它重新创建,但是在onCreateView(...)调用时配置仍然是旧的.

如果我可以捕获configChanges事件,如果用户只在该屏幕(片段)上,但在其他任何地方保留Activity娱乐,那将是很好的.

不建议使用更多活动,由于UI/UX原因,我无法为此屏幕和应用程序的其余部分使用单独的活动.

youtube android android-fragments android-orientation android-youtube-api

14
推荐指数
1
解决办法
1104
查看次数

如何在单/双窗格布局中管理UI状态和后端堆栈

我无法解决如何Fragment在典型的列表细节设计模式中正确管理s的问题.

我的布局工作正常,横向视图(双窗格)的结构如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout ... >
    <FrameLayout android:id="@+id/list" ... />
    <FrameLayout android:id="@+id/container" ... />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

像这样的纵向视图(单个窗格):

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/container" ... />
Run Code Online (Sandbox Code Playgroud)

我还有一个refs.xmlin res/values-w600dp/,以确保根据设备的屏幕宽度加载适当的布局.

选择列表项时,横向视图应并排显示列表和详细信息,而纵向视图应仅显示全屏详细信息.如果未选择任何内容,则横向视图应显示左侧的左侧和右侧的空白区域,而纵向视图应仅显示全屏列表.

例

但是,这是我遇到麻烦的地方:

  • 我是否使用"main" Activity作为列表+可选的详细信息布局,另一个"详细信息" Activity用于纵向,仅详细信息布局?这似乎是Fragments指南示例所做的.我已经得到了这个普遍的工作,但是当方向改变时,我如何保持我的细节片段的状态?

    考虑上面显示的相反情况 - 从纵向旋转到横向,同时细节可见意味着Activity需要finish()编辑细节,因此主要Activity可以显示双窗格布局,但这也会破坏细节片段及其细节savedInstanceState.如果用户EditText在详细信息片段的字段中键入了信息,然后旋转设备,当我将其添加到主(双窗格)时,如何保留详细信息片段的整个UI状态Activity

  • 我是否只使用一个ActivityFragment自己管理?这允许我在方向改变时保留细节UI的状态(因为Android会自动处理这个问题),但是当它涉及到后端堆栈时会变得混乱.

    考虑图像中的情况 - 当细节可见时应从横向旋转到纵向应显示单窗格显示详细信息,但如何正确管理后堆栈和ActionBar主页图标以显示列表单窗格?旋转回到横向还需要撤消我之前执行的任何后向堆栈操作,因为两个片段将立即可见.

经过一些搜索后,我发现了两个类似的问题(从双窗格切换到单窗格上的方向更改维护片段堆栈保留活动之间的片段状态),但我的情况略有不同,因为我不是要尝试改进此功能但是最好预先计划好.我错过了什么?当然,Android可以同时管理后台堆栈(如多个Activity案例) UI状态(如单个Activity案例中),对吧?

android android-lifecycle android-fragments android-orientation

13
推荐指数
1
解决办法
3751
查看次数

在Android中的三星设备上的摄像头捕获方向

我正在创建一个相机应用程序.捕获时的图像显示在网格视图中.现在,代码在除三星设备之外的所有设备上都能正常工作.

我正面临着方向问题.当我以纵向模式拍摄图像时,图像在网格视图中显示时会旋转.我没有保留任何旋转代码.其次,使用EXIF我在网格视图中获得了正确的图像,但是当设备方向改变时,图像再次以旋转的方式旋转.

附加图片: 在此输入图像描述

在此输入图像描述

对不起图像的分辨率.请知道它们是否不正确.将再次上传.我知道SO上有很多这样的帮助.但我想我在某个地方被困住了.

我指的是以下链接:

http://blog.andolaso​​ft.com/2013/06/how-to-show-captured-images-dynamically-in-gridview-layout.html

android screen-orientation android-camera android-camera-intent android-orientation

13
推荐指数
2
解决办法
1万
查看次数

screenOrientation portrait和userPortrait有什么区别

我需要知道的真正的区别screen orientation userPortraitportrait.什么时候用?

什么时候?

 android:screenOrientation="portrait"
Run Code Online (Sandbox Code Playgroud)

什么时候?

 android:screenOrientation="userPortrait"
Run Code Online (Sandbox Code Playgroud)

android android-orientation

13
推荐指数
1
解决办法
5916
查看次数