2012-03-28 6 views
17

Ich habe ein paar andere ähnliche Fragen gesehen, aber keine Antworten.Wie erkennt man die Drehung des Bildschirms um 180 Grad von Quer- auf Querformat?

Beim Drehen von Hochformat in Querformat (in beide Richtungen) und wieder zurück erhalten wir den hilfreichen Aufruf von onConfigurationChanged().

Wenn jedoch von Landschaft zu Landschaft (um 180 Grad) gedreht wird, wird onConfigurationChanged() nicht aufgerufen.

Ich habe erwähnt, OrientationEventListener verwenden, aber das scheint flakey für mich, weil Sie schnell drehen können, ohne eine Änderung der Anzeigeausrichtung auslösen.

Ich habe versucht, einen Listener für Layoutänderungen hinzuzufügen, aber ohne Erfolg.

Die Frage ist also, wie man eine solche Änderung der Querformatorientierung zuverlässig erkennen kann?

+0

Ich bin derzeit das gleiche Problem. Hast du eine Lösung gefunden? –

+0

Sorry, bisher nichts. –

+0

Ich habe das gleiche Problem..got jede Lösung ?? Bitte posten wenn du es gefunden hast ... ich habe schon meine 1 Woche in diesem –

Antwort

7

Mai werden Sie einige logische Code in Ihre OrientationEventListener wie folgt hinzufügen sollte:

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

verloren Das hilft mir Danke .. –

+0

Warum nur 90 und 270 Grad? Telefone können normalerweise nicht auf den Kopf gestellt werden, aber Tablets tun es. Das gleiche Problem ist, wenn Sie 180 Grad drehen. vom Porträt. – Oliv

+0

Vorsicht vor dieser Antwort! 'OrientationEventListener' ist nicht das richtige Werkzeug für 180 ° Orientierungsänderungen, da es ständig in Echtzeit und noch vor' getRotation() 'Änderungen auslöst! 'DisplayListener' macht einen viel besseren Job, da es nur genau dann auslöst, wenn 'getRotation()' sich ändert. – 0101100101

3

Ich benutze diesen Code, um es für meinen Fall arbeiten.

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

Vorsicht vor dieser Antwort! 'OrientationEventListener' ist nicht das richtige Werkzeug für 180 ° Orientierungsänderungen, da es ständig in Echtzeit und noch vor' getRotation() 'Änderungen auslöst! 'DisplayListener' macht einen viel besseren Job, da es nur genau dann auslöst, wenn 'getRotation()' sich ändert. – 0101100101

4

OrientationEventlistener funktioniert nicht, wenn sich das Gerät nicht dreht/bewegt.

Ich finde Display Listener ist eine bessere Möglichkeit, die Änderung zu erkennen.

 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

Hinweis: Dies erfordert API Level 17+ – lapis

+0

Warum benötigen Sie OrientationEventlistener um zu arbeiten, wenn das Gerät nicht rotiert/bewegt? –

+0

Meine App muss einen neuen Orientierungsstatus bereitstellen, aber manchmal kann die Ausrichtung durch Aufrufen der API geändert werden. Schließlich habe ich einen Thread verwendet, um seinen Status zu ziehen. Keine bessere Lösung, da dies nur mit API 17+ funktioniert. – superuser

Verwandte Themen