标签: screen-orientation

在活动开始期间优雅地处理屏幕方向变化

我正在尝试找到一种方法来正确处理设置活动,其中的方向取决于启动它的意图中的数据.这适用于用户可以选择级别的游戏,其中一些是纵向方向,一些是横向方向.我面临的问题是,setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)在活动完全加载之前不会生效.这对我来说是一个问题,因为我在启动期间进行了一些加载和图像处理,我只想做一次.

目前,如果用户选择了景观级别:

  • 活动开始于onCate(),默认为肖像
  • 通过分析它的发布意图发现它应该是横向的
  • 无论如何继续onResume(),加载信息和执行其他设置任务
  • 此时setRequestedOrientation启动,因此应用程序通过onPause()运行到onDestroy()
  • 然后它再次从onCreate()启动并运行到onResume()重复之前的设置

有没有办法避免这种情况,并且没有执行两次加载?例如,理想情况下,即使onCreate被调用,活动也会知道它是应该是横向还是纵向,这取决于启动意图的某些属性,但除非我错过了一些不可能的东西.我已经设法通过boolean在耗时的加载步骤之前检查a来避免重复加载的方法,但这似乎不是正确的方法.我想我可以覆盖onSaveInstanceState,但这需要大量额外的编码.有一个简单的方法吗?

谢谢!


解:

根据丹尼尔的回答,这实际上很容易解决.我只需做一些小改动.在我的"菜单"活动中,玩家将选择要播放的等级,我只需添加一个if/else检查来选择我的Intent将启动哪个类.这是通过一个表示肖像或风景的简单int完成的,当玩家选择一个关卡时确定.然后我创建了第二个扩展我的'GameLogic'类的类; 这是包含游戏本身大部分代码的类,而不是菜单,说明等.

public class GameLandscape extends GameLogic{
}
Run Code Online (Sandbox Code Playgroud)

字面上那简单而完全空洞.这样,它继承了我以前的活动中的所有代码,我已经将其编码为根据方向不同地处理事物.最后,我只需要在清单中添加一行,说明GameLandscape将始终在横向上运行,GameLogic将始终以纵向运行.

确实是一个简单的问题.

layout android screen-orientation

4
推荐指数
1
解决办法
2729
查看次数

Viewflipper Receiver在2.1和2.2中的方向更改时未注册错误

我正在使用viewflipper进行fling手势识别,一切正常,但是在2.2和2.1中它抛出异常,因为"java.lang.IllegalArgumentException:Receiver not registered:android.widget.ViewFlipper"下面是完整的调试跟踪.


java.lang.IllegalArgumentException: Receiver not registered: android.widget.ViewFlipper$1@452f8398
09-19 11:33:06.825: ERROR/AndroidRuntime(393):     at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:793)
09-19 11:33:06.825: ERROR/AndroidRuntime(393):     at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:814)
09-19 11:33:06.825: ERROR/AndroidRuntime(393):     at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331)
09-19 11:33:06.825: ERROR/AndroidRuntime(393):     at android.widget.ViewFlipper.onDetachedFromWindow(ViewFlipper.java:104)
09-19 11:33:06.825: ERROR/AndroidRuntime(393):     at android.view.View.dispatchDetachedFromWindow(View.java:6033)
09-19 11:33:06.825: ERROR/AndroidRuntime(393):     at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1158)
09-19 11:33:06.825: ERROR/AndroidRuntime(393):     at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
09-19 11:33:06.825: ERROR/AndroidRuntime(393):     at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
09-19 11:33:06.825: ERROR/AndroidRuntime(393):     at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
09-19 11:33:06.825: ERROR/AndroidRuntime(393):     at android.view.ViewRoot.dispatchDetachedFromWindow(ViewRoot.java:1630)
09-19 11:33:06.825: ERROR/AndroidRuntime(393):     at android.view.ViewRoot.doDie(ViewRoot.java:2671)
09-19 11:33:06.825: ERROR/AndroidRuntime(393):     at android.view.ViewRoot.die(ViewRoot.java:2641)
09-19 11:33:06.825: ERROR/AndroidRuntime(393):     at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:218)
09-19 11:33:06.825: ERROR/AndroidRuntime(393):     at android.view.Window$LocalWindowManager.removeViewImmediate(Window.java:436)
09-19 11:33:06.825: …
Run Code Online (Sandbox Code Playgroud)

android screen-orientation android-sdk-2.1 viewflipper android-2.2-froyo

4
推荐指数
1
解决办法
4253
查看次数

如何仅在横向模式下限制j2me应用程序

我正在使用J2ME和LWUIT开发应用程序.我想仅在横向模式下运行此应用程序.对于诺基亚,有一个属性:Nokia-MIDlet-App-Orientation:landscape,但对于其他设备,仅将应用程序限制为横向模式的属性是什么?如何为不同的J2ME设备实现这一目标?

lwuit landscape java-me screen-orientation

4
推荐指数
1
解决办法
1583
查看次数

Android - 检测反向横向

我需要检测反向横向,以防止用户开始捕获垂直视频。

我在layout-landlayout-port文件夹中实现了 2 个布局,其中包含不同的控件集。问题是 Android 不允许我专门为反向景观创建单独的布局。我需要这个,因为在这种情况下视频是倒置的,尽管 UI 显示正确。

如果我将设备从 0 方向旋转到 180 度,Android 甚至不会调用onCreate()我的活动,但在这种情况下视频会翻转。

有人可以建议一个工作示例如何检测某些设备方向(在我的情况下是反向横向)以为此方向使用另一种布局?

android screen-orientation android-layout android-camera

4
推荐指数
1
解决办法
3325
查看次数

为什么模拟器在方向改变时表现不正确?

据我所知,默认情况下,当设备旋转时,当前活动将被销毁并重新创建。我正在使用 LeftCTRL+F12 旋转模拟器,但它没有被破坏。我在日志中OnDestroyOnCreateOnStartOnResume,但没有那些火了起来,当我旋转设备。

前:

改变前

后:

更改后

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.geo_quiz"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.geo_quiz.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

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

java android screen-orientation

4
推荐指数
1
解决办法
1265
查看次数

如何更改屏幕方向,而不在Android上创建新活动?

我不知道标题是否正确,这是怎么回事.

我有一个应用程序在手机和平​​板电脑上的工作方式不同,在手机上它显示为平板电脑上的肖像,它显示为风景.

为了实现这一点,我创建了一个名为CoreActivity的类,它由我的所有活动扩展,并执行以下操作:

public class CoreActivity extends Activity {
    protected boolean _landscape = false;

    public boolean isPhone() {
        int layoutSize = getScreenLayoutSize();
        return (layoutSize == Configuration.SCREENLAYOUT_SIZE_SMALL || layoutSize == Configuration.SCREENLAYOUT_SIZE_NORMAL);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (isPhone() && !_landscape) {
            this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } else {
            this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
    }


    protected int getScreenLayoutSize() {
        return (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK);
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望在横向模式下在手机设置上显示屏幕时出现问题,为此我使用以下内容:

@Override
protected void onCreate(Bundle savedInstanceState) {
    _landscape = true
    super.onCreate(savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)

问题是,在手机上,如果用户手持手机处于纵向模式(因为大多数应用程序处于纵向模式),则会创建并销毁活动,然后重新创建.但如果他们将它保持在横向模式,那么它只创建一次.

我的问题出现是因为在onCreate方法中我启动了加载数据的线程,我也显示了片段.

有没有办法避免这个问题?有没有办法从纵向模式开始启动活动而不更改它,或者不创建两次?

提前感谢您提供的任何帮助

android screen-orientation

4
推荐指数
2
解决办法
5532
查看次数

方向更改后 Recyclerview 未填充数据

我有一个 recyclerview 具有不同的纵向和横向布局。当活动开始时,无论方向如何,recyclerview 都会填充数据。但如果方向改变,则不会显示任何数据。并且没有显示有关随之而来的方向变化的数据。

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Log.d("CCC", "OnCreate View called");
    View view = inflater.inflate(R.layout.fragment_coach_list, container, false);
    new NetworkConnector(getActivity(), coachListURL, method, null, new OnRequestComplete());
    Log.d("CCC", "Network connector called");
    return view;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Log.d("CCC", "On View created called");
    //if rv is declared in oncreateview then NPE during setadapter
    coachRecyclerView = (RecyclerView) getActivity().findViewById(R.id.fcoachlist_rv);
    final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    Log.d("CCC", "orientation " + layoutManager.getOrientation());
    coachRecyclerView.setLayoutManager(layoutManager);
} …
Run Code Online (Sandbox Code Playgroud)

android screen-orientation orientation-changes android-recyclerview

4
推荐指数
2
解决办法
5050
查看次数

UITableViewCell 列宽根据屏幕方向 IOS Swift 更改

我需要在我正在开发的应用程序之一中制作类似于下表的结构。我正在使用 UITableView 创建这个表格,我需要我的表格列宽根据屏幕方向进行更改。我已经为列宽设置了约束,我将使用viewDidLoad() 中的屏幕宽度为这些值赋值。

但是,当屏幕方向发生变化时,我无法弄清楚如何重新对齐这些约束。我发现viewWillTransition()会在方向改变时被调用 & 我重新计算了里面的约束 & 为表视图调用了 setNeedsLayout() 。但是,当屏幕方向改变时,我无法让我的表格视图重置表格列宽。我是 IOS 平台的新手,任何帮助将不胜感激。

HDR_parName/HDR_parValue/HDR_minValue/HDR_maxValue

Para1/value1/minvalue1/maxvalue1

Para2/value2/minvalue2/maxvalue2

uitableview screen-orientation ios swift

4
推荐指数
1
解决办法
3310
查看次数

处理屏幕方向的最佳方式使用动态创建的视图时更改?

当我开始我的应用程序的某个活动时,用户"欢迎"一个对话框,他必须填写一些数据才能继续.然后,在活动本身,用户有2个按钮,使他能够动态创建和删除无限数量的字段(由几个视图组成)

如您所知,当屏幕方向发生变化时,活动将重新启动,因此每个信息都会丢失.显然,这可能会有问题.

为了处理屏幕方向,android文档建议开发人员使用onRetainNonConfigurationInstance().唯一的问题是,如果你使用它来保存上下文中的对象,所有绑定的视图都会泄漏.在我的情况下,这是进一步的问题,因为该活动中的数据固有地与其视图相关联,而视图又与其上下文相关联.

Android文档不建议开发人员自己处理配置更改.他们陈述(并且我引用)"一般来说,短期解决方案只会使他们的生活复杂化"

我可以轻松绕过初始对话框,创建一个hasBeenShown布尔值并将其设置为true.我甚至可以通过保存元数据来绕过"动态创建的视图"问题:在这种情况下,生成的字段数量,类型,彼此的相对位置,文本或选择等等...(有一些小的错误,但没有什么严重的).

但由于字段(视图)是使用layoutInflate动态生成的(因此我们可以拥有无​​限数量的视图),因此在屏幕方向更改后重新生成这些相同的字段时,即使在模拟器上,应用程序也会变得非常慢.在真实设备(三星Galaxy S)上有20个视野(大约120个视图),花了将近1分钟才完成.

奇怪的是,当我直接传递视图(因此泄漏所有这些东西)时,我的Samsumg Galaxy S花了不到10秒就完成了.

有了这些信息,您认为最好的方法是什么?

(1) - 让字段重置?(不是一个真正的选择,我打赌如果他们无意中倾斜他们的屏幕= P,任何人都会生气

(2) - 添加一个加载屏幕,而android负责改变屏幕方向?

(3) - 阻止屏幕方向改变

(4) - 处理屏幕方向改变自己,并希望阻止Doom Android文档谈论永远不会来.

PS:有点offtopic,但当我的活动结束时,所有内存都被释放了吗?

android memory-leaks screen-orientation

3
推荐指数
1
解决办法
2932
查看次数

Android:在屏幕方向更改时保存应用程序状态

在发布此问题之前,我已经看过以下链接

http://www.devx.com/wireless/Article/40792/1954

使用"保存实例状态"保存Android活动状态

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

如果状态是由我的类组成的,如何在Android中的方向更改期间保存状态?

我没有得到如何覆盖以下功能:

@Override
    public Object onRetainNonConfigurationInstance() {
        return someExpensiveObject;
    }
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我有一个editext可见的布局,当第一个editext的数据验证为true时,其他editext可见.我已将所有其他editextes和textviews的可见性设置为false,并在验证后使它们可见.

因此,在我的活动中,如果更改了屏幕方向,则所有项目都将变为android:visibility="false"不可见.

我也知道当我们的活动屏幕方向改变时,它调用onStop()后跟onDestroy(),然后通过调用onCreate()再次启动一个新活动

这是原因..但我没有得到如何解决它..

在这里您可以看到我的应用程序的屏幕截图:

在此输入图像描述 在此图像中,所有字段都被加载,而在另一个图像中,当屏幕方向变为横向时,它们都消失了

在此输入图像描述

任何教程或代码片段的链接都会非常值得注意.

而且还当我的应用程序崩溃进度对话框显示了,我试图改变屏幕orientation.How来处理这个?

谢谢

android screen-orientation android-screen

3
推荐指数
1
解决办法
6443
查看次数