2012-03-28 20 views
17

私はこれに似た他のいくつかの質問を見ましたが、答えはありません。再び肖像画から風景まで(いずれかの方向)に回転し、風景から風景の向きから180度の画面回転を検出するにはどうすればよいですか?

は、我々は)(onConfigurationChangedに役立つコールを取得します。

しかし、(180度)の風景からの風景に()onConfigurationChanged回転するときに呼び出されません。

私はOrientationEventListenerを使用しての言及を見てきましたが、あなたは、ディスプレイの向きの変更をトリガすることなく周りに素早く回転させることができるので、これは私にはフレーク状思えます。

私はしかし、誰成功し、レイアウト変更リスナーを追加しようとしました。

そこで問題は確実に横向きで、このような変化を検出する方法、ありますか?

+0

現在、同じ問題が発生しています。解決策を見つけましたか? –

+0

申し訳ありませんが、これまでのところありません。 –

+0

私は同じ問題を抱えています。私がそれを見つけたら投稿してください...私はすでにこの1週間を失ってしまいました –

答えて

7

は、あなたがこのようなあなたのOrientationEventListenerにいくつかの論理的なコードを追加する必要がありである場合があります。

mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 

OrientationEventListener orientationEventListener = new OrientationEventListener(this, 
     SensorManager.SENSOR_DELAY_NORMAL) { 
    @Override 
    public void onOrientationChanged(int orientation) { 

     Display display = mWindowManager.getDefaultDisplay(); 
     int rotation = display.getRotation(); 
     if ((rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) && rotation != mLastRotation) { 
      Log.i(TAG, "changed >>> " + rotation); 

      // do something 

      mLastRotation = rotation; 
     } 
    } 
}; 

if (orientationEventListener.canDetectOrientation()) { 
    orientationEventListener.enable(); 
} 
+0

これは私に感謝します.. –

+0

なぜ90度と270度ですか?携帯電話は通常、逆さにすることはできませんが、タブレットではできません。同じ問題は180度回転するときです。肖像画から。 – Oliv

+0

この回答に注意してください! 'OrientationEventListener'は、180度方向の変化のための正しいツールではありません。なぜなら、それはリアルタイムで、そして、' getRotation() 'が変化する前であっても、常にトリガするからです! 'DisplayListener'は、' getRotation() 'が変更されたときにだけトリガするので、はるかに優れた仕事をします。 – 0101100101

3

私はそれが私の場合のために働くには、このコードを使用します。

OrientationEventListener mOrientationEventListener = new OrientationEventListener(mActivity) 
    { 
    @Override 
    public void onOrientationChanged(int orientation) 
    { 
     if (orientation == ORIENTATION_UNKNOWN) return; 

     int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation(); 
     switch (rotation) { 
      case Surface.ROTATION_0: 
      android.util.Log.i(TAG, "changed ROTATION_0 - " + orientation); 
      break; 
      case Surface.ROTATION_90: 
      android.util.Log.i(TAG, "changed ROTATION_90 - " + orientation); 
      break; 
      case Surface.ROTATION_180: 
      android.util.Log.i(TAG, "changed ROTATION_180 - " + orientation); 
      break; 
      case Surface.ROTATION_270: 
      android.util.Log.i(TAG, "changed ROTATION_270 - " + orientation); 
      break; 
     } 
     if ((rotation != mLastRotation) && (rotation & 0x1) == (mLastRotation & 0x1)) 
     { 
      android.util.Log.i(TAG, "unhandled orientation changed >>> " + rotation); 
     } 
     mLastRotation = rotation; 
    } 
    }; 

    if (mOrientationEventListener.canDetectOrientation()){ 
    mOrientationEventListener.enable(); 
    } 
+0

この回答にご注意ください! 'OrientationEventListener'は、180度方向の変化のための正しいツールではありません。なぜなら、それはリアルタイムで、そして、' getRotation() 'が変化する前であっても、常にトリガするからです! 'DisplayListener'は、' getRotation() 'が変更されたときにだけトリガするので、はるかに優れた仕事をします。 – 0101100101

4

OrientationEventListenerは、デバイスが回転/移動していないときは機能しません。

私は表示リスナーが変更を検出するためのより良い方法です見つけます。

 DisplayManager.DisplayListener mDisplayListener = new DisplayManager.DisplayListener() { 
     @Override 
     public void onDisplayAdded(int displayId) { 
      android.util.Log.i(TAG, "Display #" + displayId + " added."); 
     } 

     @Override 
     public void onDisplayChanged(int displayId) { 
      android.util.Log.i(TAG, "Display #" + displayId + " changed."); 
     } 

     @Override 
     public void onDisplayRemoved(int displayId) { 
      android.util.Log.i(TAG, "Display #" + displayId + " removed."); 
     } 
    }; 
    DisplayManager displayManager = (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE); 
    displayManager.registerDisplayListener(mDisplayListener, UIThreadHandler); 
+0

注:これにはAPIレベル17+ – lapis

+0

が必要ですなぜデバイスが回転/移動していないときにOrientationEventListenerが機能する必要がありますか? –

+0

私のアプリは新しい向きのステータスを提供する必要がありますが、APIを呼び出すことによって向きが変更されることがあります。 最後に、ステータスを取得するためにスレッドを使用しました。これはAPI 17+でのみ機能するため、これ以上の解決策はありません。 – superuser

関連する問題