4

我必须解决以下问题:我有一个Activitywhich's android:screenOrientation="portrait"。即使,当设备在Activity可见的情况下旋转到横向时,我必须启动另一个,并且当设备旋转回纵向时,我必须finish()在横向进行活动。我尝试使用 来执行此BroadcastReceiver操作,但由于android:screenOrientation="portrait". 任何帮助都将不胜感激。

谢谢。

4

7 回答 7

8

Philipp 在获取手机方向但将屏幕方向固定为纵向工作的解决方案非常适合我:

您可以使用 SensorManager 类来获取 Android 设备的方向,即使在 Manifest 中通过 android:screenOrientation="portrait" 禁用自动方向切换时也是如此

请参阅此代码(由 Philipp 提供,请参阅上面的链接):

SensorManager sensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
    sensorManager.registerListener(new SensorEventListener() {
        int orientation=-1;;

        @Override
        public void onSensorChanged(SensorEvent event) {
            if (event.values[1]<6.5 && event.values[1]>-6.5) {
                if (orientation!=1) {
                    Log.d("Sensor", "Landscape");
                }
                orientation=1;
            } else {
                if (orientation!=0) {
                    Log.d("Sensor", "Portrait");
                }
                orientation=0;
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub

        }
    }, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
于 2014-03-28T09:03:48.837 回答
5

当 android:screenOrientation="portrait" 或 "landscape" 在清单文件中设置时,如果您想这样做,仍然不会触发侦听器,请尝试以编程方式在您的 onConfigurationChanged() 中处理仅纵向模式,在这里您也可以开始再次活动。

于 2012-09-10T11:35:35.410 回答
1

您始终可以使用传感器找出您的方向;

public static final int PORTRAIT        = 0;
public static final int PORTRAIT_REV    = 2;
public static final int LANDSCAPE       = 1;
public static final int LANDSCAPE_REV   = 3;

private final SensorEventListener mListener = new SensorEventListener() {

   public void onSensorChanged(SensorEvent event) {


            azimuth = event.values[0];
            pitch   = event.values[1];
            roll    = event.values[2];

            {
                if (pitch < -45 && pitch > -135) {
                    orient = PORTRAIT;
                } else if (pitch > 45 && pitch < 135) {
                    orient = PORTRAIT_REV;
                } else if (roll > 45) {
                    orient = LANDSCAPE;
                } else if (roll < -45) {
                    orient = LANDSCAPE_REV;
                }

            }

           // if(orient!=lastOrient && !orientChanging)
           // {
           //   orientChangeStart = System.currentTimeMillis();
           //   orientChanging = true;
           // }
}
于 2012-09-09T09:35:18.130 回答
1

经过一番挣扎,我发现最好的方法是像这样使用 OrientationEventListener :

private void addOrientationListener()
    {
        OrientationEventListener listener=new OrientationEventListener(getActivity(), SensorManager.SENSOR_DELAY_UI)
        {
            public void onOrientationChanged(int orientation) {

                if( (orientation>=230 && orientation<=290) || (orientation>=70 && orientation<=90))
                {
                    isLandscape=true;
                }
                else if(orientation==-1){
                    //KEEP THE CURRENT SATTE
                }
                else
                {
                    isLandscape=false;
                }
            }
        };
        if(listener.canDetectOrientation())
            listener.enable();
    }

你应该在 OnPause() 上调用 disable()

于 2015-06-29T06:27:05.563 回答
0

你用过方向监听器吗?我不确定这是否正是您所需要的,但我收集到您想知道方向何时来回变化:

http://developer.android.com/reference/android/view/OrientationListener.html

于 2012-09-05T21:00:11.470 回答
0

您需要使用的类是OrientationEventListener,假设您可以检测到旋转。如果您使用 强制屏幕进入特定方向android:screenOrientation="portrait",则不会触发这些事件。

相反,我建议制作两个 layout.xml 文件并使用配置限定符来确定应该显示哪一个。(http://developer.android.com/guide/practices/screens_support.html

res/layout-land/my_layout.xml
res/layout-port/my_layout.xml

然后使用OrientationEventListener来检测屏幕何时旋转。当屏幕从横向旋转到纵向时,您可以finish();或调用您想要的任何功能。

祝你好运!

于 2012-09-05T21:35:13.237 回答
0

您可以通过多种方式进行操作,一种是收听其他帖子中讨论的广播消息,另一种方法如下。

在清单中为活动设置android:configChanges="orientation",这将使您可以控制方向更改。通过这样做,您可以覆盖该onConfigurationChanged()方法并开始您的新活动活动。

于 2012-09-10T12:49:41.593 回答