2012-08-29 14 views
2

我必须解决以下问题:我有一个Activity这是android:screenOrientation="portrait"。即使当设备旋转到风景,而此Activity可见时,我必须启动另一个设备,并且当设备旋转回肖像时,我必须在景观中进行finish()活动。我试图用BroadcastReceiver来执行此操作,但由于android:screenOrientation="portrait",此特殊活动未收到任何广播。任何帮助,非常感谢。检测方向变化,当只有肖像被允许在Android上

谢谢。

+0

拿上这个一看:http://stackoverflow.com/a/41104983/2267723该解决方案使用的SensorManager。 –

回答

3

当机器人:screenOrientation =“人像”或“风景”在menifest文件中设置没有听众仍然解雇如果u想这样做尝试处理肖像唯一模式UR onConfigurationChanged()编程和这里你也将能够再次开始活动。

+1

同意。如果你只想要一个方向,Android不会通知你。但是一个监听器可能工作(从未尝试过)。 – shkschneider

+0

谢谢。这帮助了我。 – overbet13

0

您使用过Orientation Listener吗?我不知道如果这是你需要什么,但我收集要找出当定向来回变化:

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

+0

你试过这个吗?当你尝试这种方法时,你会看到定向侦听器的回调被称为很多次,即使是在最轻微的动作中。这对我来说不是一种选择。 – overbet13

+0

我的意思是这可能有帮助,但我需要编写一个算法来处理来自回调的数据,对此我没有时间。 – overbet13

+0

为什么'onOrientationChanged(int orientation)'不适合你?如果参数为90或270度,它只会检测变化时的变化。这不是你想要的吗? http://developer.android.com/reference/android/view/OrientationEventListener.html#onOrientationChanged(int) – HumanCentipedeLinkedList

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();或调用您想要的任何功能。

祝你好运!

+0

我有一个活动,我有一个观点鳍状肢。而且,我希望允许设备显示横向视图,当且仅当视图脚蹼的特定孩子位于顶部时。这意味着我只想捕捉景观事件,如果用户在一个特定的视图。我不希望其他视图(以及整个活动)在轮换时重新创建。 – overbet13

+0

逻辑应该完全相同,只能创建特定子视图的layout-land /和layout-port /版本。如果您可以使用OrientationEventListener捕获事件,那么您也可以用这种方式手动重新填充子视图。 –

+0

只需尝试在设备上使用OrientationEventListener,尝试旋转它并查看结果。然后试着解释一下,谢谢。 – overbet13

0

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

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; 
      // } 
} 
+0

此答案无法使用。充满错误。 – overbet13

+0

您在发送之前是否尝试过这段代码?另外,我宁愿看一些文档... – overbet13

+0

那么错误在哪里呢? – ZZZ

0

您可以通过几种方式来完成,其中一个正在收听其他帖子中讨论的广播消息,另一个选项如下。

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

5

菲利普在Get phone orientation but fix screen orientation to portrait工作的完美解决方案对我来说:

可以使用的SensorManager类来获得Android设备的方向,即使在自动定向切换在清单由Android禁用:screenOrientation =“画像“

看到这个代码(由菲利普,见上面的链接):

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); 
+0

拯救生命....... –

+1

这样会消耗太多电量。由于这种情况,不应该在这种情况下使用'SensorEventListener'。 –

0

有点挣扎后,我发现使用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()()

相关问题