为啥此代码不会显示 Android 设备方向更改?

Posted

技术标签:

【中文标题】为啥此代码不会显示 Android 设备方向更改?【英文标题】:Why won't this code show Android device orientation changes?为什么此代码不会显示 Android 设备方向更改? 【发布时间】:2016-02-24 18:10:21 【问题描述】:

昨晚,当我旋转我的 android 设备时,这段代码 (which I found here) 显示了各种 Log 输出,值从 0 到 360,可能还有一些负数。

但是今天不行。没有Log 输出。我在Log 语句上放了一个断点;调试时不停。

我今天早上更改了几行以根据orientation 的值设置一个值,然后问题(无输出)浮出水面,所以我使用Show history 恢复到最后一个MainActivity.java 的版本昨晚活跃。但是调试时没有输出,也没有停在Log语句处。

这是怎么解释的?

import android.app.Activity;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.view.OrientationEventListener;

public class MainActivity extends Activity

    OrientationEventListener myOrientationEventListener ;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        myOrientationEventListener = new OrientationEventListener(this,
                SensorManager.SENSOR_DELAY_NORMAL)
        
            @Override
            public void onOrientationChanged(int orientation) 
            
                Log.w("Orient", orientation + "");
                myOrientationEventListener.enable();
            
        ;
    

** 编辑 **

根据Show history 的要求,这里是AndroidManifest.xml,自2/19 以来没有变化,但我很乐意添加权限;但是昨晚效果如何? [另外:添加了在<activity 内突出的行,如第一个答案中所建议的那样。]

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

                <uses-sdk
                        android:minSdkVersion="11"
                        android:targetSdkVersion="16" />

                <application
                        android:allowBackup="true"
                        android:icon="@drawable/ic_launcher"
                        android:label="@string/app_name"
                        android:theme="@style/AppTheme" >
                        <activity
                                   android:name="com.dslomer64.nowweregettinsomewheres.fragments.MainActivity"

android:configChanges="orientation|keyboardHidden"

                                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>

这是 Android Studio 1.5.1 的输出:

            02-24 12:55:12.554 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: endBatchEdit on inactive InputConnection

            02-24 12:55:12.632 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: showStatusIcon on inactive InputConnection

            02-24 12:55:12.632 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: getExtractedText on inactive InputConnection

            02-24 12:55:12.670 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection

            02-24 12:55:12.672 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: getTextAfterCursor on inactive InputConnection

            02-24 12:55:12.673 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: getSelectedText on inactive InputConnection

            02-24 12:55:12.674 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: beginBatchEdit on inactive InputConnection

            02-24 12:55:12.674 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: endBatchEdit on inactive InputConnection

            02-24 12:55:13.031 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: beginBatchEdit on inactive InputConnection

            02-24 12:55:13.032 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: endBatchEdit on inactive InputConnection

            02-24 13:00:07.936 14836-14836/com.bffmedia.hour8app.intro W/InputMethodManager: startInputInner : InputBindResult == null

            02-24 13:00:07.946 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: showStatusIcon on inactive InputConnection

            02-24 13:04:06.824 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: showStatusIcon on inactive InputConnection

            02-24 13:04:06.973 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: getExtractedText on inactive InputConnection

            02-24 13:04:07.022 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection

            02-24 13:04:07.022 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: getTextAfterCursor on inactive InputConnection

            02-24 13:04:07.023 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: getSelectedText on inactive InputConnection

            02-24 13:04:07.025 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: beginBatchEdit on inactive InputConnection

            02-24 13:04:07.025 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: endBatchEdit on inactive InputConnection

            02-24 13:04:07.402 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: beginBatchEdit on inactive InputConnection

            02-24 13:04:07.402 14836-14836/com.bffmedia.hour8app.intro W/IInputConnectionWrapper: endBatchEdit on inactive InputConnection

【问题讨论】:

显示您的清单。 Activity 需要具有处理方向更改的权限 其实我看过另一个 SO 问题。也许如果你想尝试其中一个赞成的答案,而不是获得 0 票的答案,它会起作用:) 昨晚效果如何???我很困惑。但我会尝试其他一种。 好吧,我不知道自昨天以来会发生什么变化(您的代码?您在不同的设备上尝试过?您的清单?您的 API 级别?,...)或者只是您旋转电话(快/慢)?但是我什至不确定你是否需要这个传感器,当方向改变时每个 Activity 都会重新启动,你应该能够在 onCreate() 中检测到它 @Gavriel--我听取了您的建议,并在下面的答案中找到了更可靠的解决方案。 【参考方案1】:
<activity android:name=".MyActivity"
      android:configChanges="orientation|keyboardHidden"
      android:label="@string/app_name">

您的清单中需要 configChanges="orientation"。

【讨论】:

我补充说。仍然没有Log 输出。 permission 呢? 好吧,我不知道这个orientationchangelistener,但是对于其他问题中的其他解决方案,您不需要比我在回答中添加的更多内容。【参考方案2】:

显然,Show history 不一定包含对代码的最后更改。显然,在昨晚赶赴约会之前,我将.enable() 声明移到了on 块之外。代码现在可以完美运行,就像昨晚一样,没有更改为 AndroidManifest.xml

        myOrientationEventListener = new OrientationEventListener(this,
                SensorManager.SENSOR_DELAY_NORMAL)
        
            @Override
            public void onOrientationChanged(int orientation) 
            
                ///////// NOT HERE myOrientationEventListener.enable(); //////////
                Log.w("Orient", orientation + "");
            
        ;
        Log.w("Listener", " can detect orientation: " + myOrientationEventListener.canDetectOrientation() + " " );

        myOrientationEventListener.enable(); // HERE ////////////////////////

我请求编辑代码来自的答案,以免下一个使用它的人。只要 enable 按逻辑放置,这个答案就可以了。

* 但是(编辑)*

在我的onCreate 方法中,那个监听器无论如何都不能正常工作。正如@Gavriel 所建议的,我找到了一个更好的方法:

if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) ... do whatever

【讨论】:

以上是关于为啥此代码不会显示 Android 设备方向更改?的主要内容,如果未能解决你的问题,请参考以下文章

PhoneGap - 为啥 Android 虚拟设备不显示更改?

设备方向更改时小部件丢失数据

保存图像后由于方向更改导致 Android 显示图像捕获错误

Android屏幕旋转不生效

Android 不会在运行时崩溃时转储错误跟踪

Android:为啥 DialogFragment 在方向更改时返回空指针