Holen Sie sich die Telefonausrichtung, aber fixieren Sie die Bildschirmausrichtung auf Hochformat

Lesezeit: 7 Minuten

Ich möchte die Telefonausrichtung erhalten, aber die Bildschirmausrichtung im Hochformat beibehalten. Unabhängig davon, ob der Benutzer das Telefon ins Quer- oder Hochformat dreht, bleibt die Ansicht gleich, aber ich kann feststellen, ob es sich im Quer- oder Hochformat befindet.

Einstellung der Aktivität auf android:screenOrientation=”portrait” wird beides beheben, aber ich könnte die Ausrichtung des Telefons nicht über erkennen

public void onConfigurationChanged(Configuration newConfig) {
    switch (newConfig.orientation) {
    case Configuration.ORIENTATION_PORTRAIT:
        Toast.makeText(this, "Portrait", Toast.LENGTH_SHORT).show();
        break;
    case Configuration.ORIENTATION_LANDSCAPE:
        Toast.makeText(this, "Landscape", Toast.LENGTH_SHORT).show();
        break;
    default:
        break;
    }
}

Hat jemand eine Idee, wie man das beheben kann?

  • Schauen Sie sich das an: stackoverflow.com/a/41104983/2267723 diese Lösung mit SensorManager.

    – Maher Abuthraa

    12. Dezember 2016 um 16:16 Uhr

Holen Sie sich die Telefonausrichtung aber fixieren Sie die Bildschirmausrichtung
Edrian

Hier ist eine Mehrzweckklasse zum einfachen Verwalten von Änderungen der Bildschirmausrichtung:

public class OrientationManager extends OrientationEventListener {

    public enum ScreenOrientation {
        REVERSED_LANDSCAPE, LANDSCAPE, PORTRAIT, REVERSED_PORTRAIT
    }

    public ScreenOrientation screenOrientation; 
    private OrientationListener listener;

    public OrientationManager(Context context, int rate, OrientationListener listener) {
        super(context, rate);
        setListener(listener);
    }

    public OrientationManager(Context context, int rate) {
        super(context, rate);
    }

    public OrientationManager(Context context) {
        super(context);
    }

    @Override
    public void onOrientationChanged(int orientation) {
        if (orientation == -1){
            return;
        }
        ScreenOrientation newOrientation;
        if (orientation >= 60 && orientation <= 140){
            newOrientation = ScreenOrientation.REVERSED_LANDSCAPE;
        } else if (orientation >= 140 && orientation <= 220) {
            newOrientation = ScreenOrientation.REVERSED_PORTRAIT;
        } else if (orientation >= 220 && orientation <= 300) {
            newOrientation = ScreenOrientation.LANDSCAPE;
        } else {
            newOrientation = ScreenOrientation.PORTRAIT;                    
        }
        if(newOrientation != screenOrientation){
            screenOrientation = newOrientation;
            if(listener != null){
                listener.onOrientationChange(screenOrientation);
            }           
        }
    }

    public void setListener(OrientationListener listener){
        this.listener = listener;
    }

    public ScreenOrientation getScreenOrientation(){
        return screenOrientation;
    }

    public interface OrientationListener {

        public void onOrientationChange(ScreenOrientation screenOrientation);
    }
}

Dies ist viel einfacher, wiederverwendbar und Sie können auch REVERSE_LANDSCAPE- und REVERSE_PORTRAIT-Ausrichtungen erhalten.

Sie müssen OrientationListener implementieren, um nur benachrichtigt zu werden, wenn eine Ausrichtungsänderung auftritt.

Vergessen Sie nicht, orientierungManager.enable() aufzurufen, um mit der Orientierungsverfolgung zu beginnen, und dann orientierungManager.disable() aufzurufen (diese beiden Methoden werden von der Klasse OrientationEventListener geerbt).

UPDATE: Anwendungsbeispiel

MyFragment extends Fragment implements OrientationListener {

    ...

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        orientationManager = new OrientationManager(getActivity(), SensorManager.SENSOR_DELAY_NORMAL, this);
        orientationManager.enable();        
    }

    @Override
    public void onOrientationChange(ScreenOrientation screenOrientation) {
        switch(screenOrientation){
            case PORTRAIT:
            case REVERSED_PORTRAIT:
                MainActivityBase.getInstance().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            break;
            case REVERSED_LANDSCAPE:
                MainActivityBase.getInstance().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            break;
            case LANDSCAPE:
                MainActivityBase.getInstance().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            break;
        }
    }
}

  • So schön, vielen Dank. Ich kann nicht glauben, dass diese Antwort nur eine positive Bewertung erhalten hat.

    – Formatc

    7. Juli 2015 um 19:22 Uhr

  • Tolle Lösung, aber bitte beachten Sie, dass dies nur auf Smartphones mit Hochformat als Standardmodus das richtige Ergebnis liefert. Auf Tablets (mit Querformat als Standard) hat die Ausrichtung im Querformat den Wert 0, d. h. Sie müssen 270 zum Ausrichtungswert addieren, bevor Sie Ihre Logik anwenden. Informationen zur standardmäßigen Geräteausrichtung finden Sie unter stackoverflow.com/questions/4553650/…

    – Jörg Eisfeld

    16. September 2015 um 15:19 Uhr


  • Und 3 Jahre später finde ich das und das ist so eine elegante Lösung … wenn ich dir nur mehr als 1 Upvote geben könnte, haha.

    – jun

    28. Oktober 2017 um 23:35 Uhr

Konnten Sie Ihre Anforderung mit dem Beschleunigungssensor erfüllen? Wenn ja, wäre vielleicht so etwas wie dieses (ungetestete) Fragment für Ihre Zwecke geeignet.

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

  • Hallo Philipp. Das ist die gleiche Lösung, die ich selbst implementiert habe. In diesem Zusammenhang scheint es keine andere Möglichkeit zu geben, als auf den Sensor zuzugreifen, um die Ausrichtung des Geräts zu erhalten.

    – Arman

    30. Januar 2012 um 16:32 Uhr

  • Ist nicht viel wert, wenn das Gerät flach auf einem Tisch liegt.

    – Johannes

    26. Juli 2013 um 16:25 Uhr


  • Weiß jemand, wie man reverse_landscape erkennt?

    – Edrian

    3. November 2014 um 20:48 Uhr

  • würde das zu viel batterie fressen?

    – Neon Warge

    7. Juli 2016 um 9:23 Uhr

Ich brauchte eine Lösung, die mir die Orientierung nur auf Abruf gibt. Dieser hat bei mir funktioniert:

public class SensorOrientationChecker {

public final String TAG = getClass().getSimpleName();

int mOrientation = 0;
private SensorEventListener mSensorEventListener;
private SensorManager mSensorManager;

private static SensorOrientationChecker mInstance;

public static SensorOrientationChecker getInstance() {
    if (mInstance == null)
        mInstance = new SensorOrientationChecker();

    return mInstance;
}

private SensorOrientationChecker() {
    mSensorEventListener = new Listener();
    Context applicationContext = GlobalData.getInstance().getContext();
    mSensorManager = (SensorManager) applicationContext.getSystemService(Context.SENSOR_SERVICE);

}

/**
 * Call on activity onResume()
 */
public void onResume() {
    mSensorManager.registerListener(mSensorEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}

/**
 * Call on activity onPause()
 */
public void onPause() {
    mSensorManager.unregisterListener(mSensorEventListener);
}

private class Listener implements SensorEventListener {

    @Override
    public void onSensorChanged(SensorEvent event) {
        float x = event.values[0];
        float y = event.values[1];

        if (x<5 && x>-5 && y > 5)
            mOrientation = 0;
        else if (x<-5 && y<5 && y>-5)
            mOrientation = 90;
        else if (x<5 && x>-5 && y<-5)
            mOrientation = 180;
        else if (x>5 && y<5 && y>-5)
            mOrientation = 270;

        //Log.e(TAG,"mOrientation="+mOrientation+"   ["+event.values[0]+","+event.values[1]+","+event.values[2]+"]");
                                                                       }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

}

public int getOrientation(){
    return mOrientation;
    }
}

1647859991 70 Holen Sie sich die Telefonausrichtung aber fixieren Sie die Bildschirmausrichtung
vitakot

Wenn Sie die Änderung der Bildschirmausrichtung deaktivieren, wird onConfigurationChanged offensichtlich niemals aufgerufen …

Ich denke, die einzige Möglichkeit besteht darin, den Beschleunigungssensor zu verwenden dieser Link.

Um darauf zuzugreifen, müssen Sie in dieser Aktivität eine Manifestdatei festlegen

android:configChanges="orientation|keyboardHidden"

Wenn der Benutzer dann das Telefon dreht, wird es in die öffentliche void onConfigurationChanged ()-Methode gebracht. Auch entfernen

android:screenOrientation="portrait" 

aus derselben Tätigkeit.

  • Aber wenn onConfigurationChanged() aufgerufen wird, wurde die Orientierungsänderung bereits durchgeführt … Ich brauche die Informationen vorher.

    – Arman

    30. Januar 2012 um 16:28 Uhr

1647859993 284 Holen Sie sich die Telefonausrichtung aber fixieren Sie die Bildschirmausrichtung
Al Ro

Das ist viel einfacher, als eine ganz neue Klasse zu schreiben:

 final OrientationEventListener orientationEventListener = new OrientationEventListener( getApplicationContext() ) {

  @Override
  public void onOrientationChanged( final int orientation ) {
    Log.i("", "orientation = " + orientation );
  }
};

orientationEventListener.enable();

  • Aber wenn onConfigurationChanged() aufgerufen wird, wurde die Orientierungsänderung bereits durchgeführt … Ich brauche die Informationen vorher.

    – Arman

    30. Januar 2012 um 16:28 Uhr

Falls jemand nach einer Webview/Javascript-Lösung für die Frage sucht, kann dies unten getan werden.

Dies löst benutzerdefinierte „Flip“-Ereignisse im Fenster aus, mit „zusätzlichen Parametern“, wie sie jquery hat. Es setzt auch window.flip, analog zu window.orientation:

$(window).on('flip',function(ev,angle,orientation) {
    console.log(angle,orientation);
    alert(window.flip);
});

if (window.DeviceOrientationEvent) {
    jQuery.flip = {
        debug       : false,
        interval    : 1000,
        checked     : false,
        betaflat    : 25,
        gammaflat   : 45,
        orientation : 'portrait-primary',
        angles      : {
            'portrait-primary'      : 0,
            'portrait-secondary'    : 0,
            'landscape-primary'     : 90,
            'landscape-secondary'   : -90       
        },
        timer       : null,
        check       : function(ev) {
            if (!this.checked) {
                var trigger=false;
                if (this.debug) console.log([ev.alpha,ev.beta,ev.gamma]);
                if (ev.beta>this.betaflat) {
                    // if beta is big its portrait
                    if (this.debug) console.log('beta portrait pri');
                    if (this.orientation!='portrait-primary') {
                        this.orientation='portrait-primary';
                        trigger=true;
                    }
                } else if (ev.beta<-this.betaflat) {
                    // if beta is big its portrait
                    if (this.debug) console.log('beta portrait sec');
                    if (this.orientation!='portrait-secondary') {
                        this.orientation='portrait-secondary';
                        trigger=true;
                    }
                } else if (ev.gamma>this.gammaflat) {

                    // else if gamma is big its landscape
                    if (this.debug) console.log('gamma landscape pri');
                    if (this.orientation!='landscape-primary') {
                        this.orientation='landscape-primary';
                        trigger=true;
                    }

                } else if (ev.gamma<-this.gammaflat) {

                    // else if gamma is big its landscape
                    if (this.debug) console.log('gamma landscape sec');
                    if (this.orientation!='landscape-secondary') {
                        this.orientation='landscape-secondary';
                        trigger=true;
                    }

                }
                if (trigger) {
                    if (this.debug) console.log('trigger flip');
                    window.flip = this.angles[this.orientation];
                    $(window).trigger('flip',[window.flip,this.orientation]);
                    this.checked=true;
                }
            }
        }
    }
    $(document).ready(function() {
        setInterval(function() {jQuery.flip.checked=false},jQuery.flip.interval);
        $(window).on('deviceorientation',function(ev) { jQuery.flip.check(ev.originalEvent) });
    });
} else {
    if (this.debug) console.log('DeviceOrientationEvent not supported');
}

Die jquery wird nicht wirklich benötigt. Ich hatte es sowieso nötig.

  • Das Lösen eines Android-Problems mit Javascript ist nicht wirklich hilfreich. Es erfordert eine WebView oder ähnliches, um das Skript auszuführen, was möglicherweise nicht der Fall ist.

    – Arman

    3. April 2017 um 20:26 Uhr

  • oh – guter punkt. Ich lebe in meiner eigenen Blase. Aktualisierung der Antwort.

    – Gemeiner Hecht

    5. April 2017 um 10:21 Uhr

  • Warum also jetzt die Ablehnung? Ich erwähne, dass dies Webview/Javascript ist, und das OP erwähnt nicht, in welcher Welt er/sie lebt.

    – Gemeiner Hecht

    30. Januar 2019 um 11:20 Uhr

1005320cookie-checkHolen Sie sich die Telefonausrichtung, aber fixieren Sie die Bildschirmausrichtung auf Hochformat

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy