Rotation bzw Orientationsänderung verhindern?

H

Horschty

Neues Mitglied
1
Hallo,

hab erst vor ein paar Tagen angefangen mit der App Entwicklung in Android und bin gleich auf ein scheinbar unlösbares Problem gestoßen...
Eigentlich wollte ich ein kleines Spiel programmieren, bei dem man einen Ball über irgendwelche Balken oder so balancieren muss mit dem Accelerometer, also das Gerät vor sich gerade hält und je nachdem wie mans kippt rollt der Ball.
Nur leider dreht sich die App ständig, wenn man das Gerät zu weit nach vorne kippt... und dann steht alles auf dem Kopf und anstatt nach unten rollt der Ball nach oben.
Die einzigen paar Antworten die ich mit Google finden kann, erwähnen immer man müsste nur im AndroidManifest.xml unter
Code:
<Activity 
...
android:screenOrientation="landscape">
auf "landscape" oder "portrait" setzen was ich schon habe.
Scheint bei allen zu klappen ausser bei mir und ich habe absolut keine Ahnung warum... kann es sein dass das bei manchen Geräten einfach ignoriert wird?
Noch eine weitere Lösung wäre angeblich:
Code:
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
im XML einzutragen und dann
Code:
void  onConfigurationChanged(Configuration config)
zu overriden. Nur wird die Methode anscheinend nie aufgerufen. Wenn ich einen Breakpoint darin setze wird der jedenfalls nie getriggert.

Es gibt zwar auch screenOrientation "lock", da funktioniert es zwar so wie ich es will, heisst es dreht sich nicht mehr, nur leider ist es dann in portrait mode, bzw in der jeweiligen "nativen Orientation" des jeweiligen Gerätes nehme ich an (hab nur eins zum Testen).
Ich würde also gerne landscape und lock kombinieren, geht das irgendwie oder kann ich mir die Idee gleich wieder aus dem Kopf schlagen?
 
mal "portrait|nosensor" als screenOrientation ausprobiert?
 
Ja, kann man leider nicht kombinieren wie bei configChanges :/

Error:(20, 40) String types not allowed (at 'screenOrientation' with value 'landscape|nosensor').
 
Das einzige was also ncoh schief gehen kann ist dass der Accelerometer in Konflikt mit deinem Manifest eintrag gerät und gewinnt...sind die beiden manifest dateien identisch?(der normale und einer in den bin folder)
 
Denke schon, wenn ich die richtige xml gefunden habe :)
Eine ist in \build\intermediates\manifests\full\release und eins in \debug
Sind identisch mit der in meinem Hauptverzeichnis.

Das komische ist, manchmal funktioniert es doch irgendwie...
Kommt glaube ich darauf an wie ich das Gerät halte, während die App startet. Wenn ich sie in der "richtigen" Lage starte, dann scheint es fixiert zu bleiben, ansonsten dreht es sich erstmal (vielleicht von reverseLandscape nach Landscape) und dann denkt es sich "Na gut, jetz hab ich schon einmal gedreht, jetzt machts auch nichts mehr wenn ich mich weiterhin drehe" ;)

Frag mich nur wie ich herausfinden soll woran das überhaupt liegt, hab keine Ahnung wo ich ansetzen soll.

Edit: Es dreht sich auch wenn ich eine neue App mache die kein Accelerometer benutzt.
Vielleicht sollte ich das "drehen" nochmal verdeutlichen, mit drehen meine ich übrigens dass es sich auf den Kopf stellt, also von landscape auf reverseLandscape (schätze ich?) wechselt und umgekehrt. Es bleibt schon in landscape und wechselt nicht zu portrait, nur soll es eben nur in EINEM von den beiden landscape modes bleiben.
 
Zuletzt bearbeitet:
Ich hatte dafür mal Code geschrieben, der die aktuelle Orientation fixt. In Kombination mit Landscape müsste das dann gehen, ich schaue nachher mal ob ich den noch finde...
 
das ist ein seltsames verhalten....wenn ich für jede activity den modus landscape einstelle dann sollte er auch im landscape bleiben

verschweigst du uns vllt etwas? andere einstellungen die du vornimmst?
echt komsich dass er nciht auf dein manifest hört!!!
 
Nein das passt schon, Landscape und Reverse Landscape werden gleich behandelt. Macht in den meisten Fällen ja schon Sinn, dass ich dem User nicht vorschreibe ob er sein Handy links oder rechts rum hält.
 
also bei mir ändert sich landscape und reverse gar nciht ich kann drehen wie ich will es bleibt im normalen landscape und ändert nicht zu reverse....
 
Jaiel schrieb:
das ist ein seltsames verhalten....wenn ich für jede activity den modus landscape einstelle dann sollte er auch im landscape bleiben
Naja es bleibt ja in landscape, das passt schon, aber wenn ich das Gerät dann auf den Kopf stelle "flippt" es sich einmal um 180° was es nicht soll.
Hab das ganze mal mit einem komplett neuen Projekt nach Vorlange in Android Studio getestet nur mit ner Blank Activity und ins Manifest die screenOrientation gesetzt, mehr hab ich nicht geändert und trotzdem flippt es munter weiter.
Vielleicht isses tatsächlich einfach nur bei mir so, liegts an meinem Tablet?
Hab ein Fire HD 6 von Amazon. Das ist ja kein "reines" Android, sondern benutzen ihre abgespaltene Version "Fire OS" davon. Schätze aber dass das nicht großartig anders sein wird, ist halt hauptsächlich wegen der Integration mit den ganzen Amazon-Services.
 
Da hätte ich ja lange rumprobieren können :|
Dann geht das wohl mit nem Fire Tablet nicht, auch wenns nicht 100%ig aus dem Text hervorgeht.
Steht ja nur "you should specify sensor-based landscape orientation" aber nicht dass NUR das geht.
Naja, schade, muss ich mir wohl was anderes einfallen lassen was ich machen könnte.
Danke für eure Hilfe :)
 
Du hast ja diese Rotation Codes gegeben im Link... :)


Die von Amazon spinnen wohl ein bisschen...können sich aber auch echt nciht entscheiden!!!

Wie dem auch sei kannst du ja immer den Orientation Code 270 oder 90 benutzen dann haben es manche im Landscape und andere wiederum im reverse...vergiss nciht die accelerometer werte dann aber auch richtig zu verarbeiten wenn du sie roh empfängst!!!
 
Zuletzt bearbeitet:
Naja schon, aber selbst wenn ich die richtige Richtung im Code mit getRotation() errechnen könnte die der Ball rollen soll, würde es ja trotzdem ständig die kleinen Aussetzer geben wenn sich der Screen dreht.
Ausser ich setze die Orientation auf "locked", und für den Fall dass es im portrait mode ist zeichne ich alles um 90° gedreht, um zu simulieren dass es im landscape mode ist, ääh...
Klingt nicht nach besonders viel Spass :)
 
jap ich hab ncohmal nachgeforscht und das fire verjält sich wirklich sehr komsich

hier mal ein Text aus den Google Docs/R.attr:
landscape 0 Would like to have the screen in a landscape orientation: that is, with the display wider than it is tall, ignoring sensor data. Corresponds to SCREEN_ORIENTATION_LANDSCAPE.

also ganz klar wenn man das Attribut screenOrientation auf landscape setzt sollte es normal auch da bleiben!!!!

Der ursprüngliche Beitrag von 20:48 Uhr wurde um 20:49 Uhr ergänzt:

Viel Erfolg ich guck mal wenn ich mehr zeit hab da lässt sich doch bestimmt was machen
 
Horschty schrieb:
Hallo,

hab erst vor ein paar Tagen angefangen mit der App Entwicklung in Android und bin gleich auf ein scheinbar unlösbares Problem gestoßen...
Eigentlich wollte ich ein kleines Spiel programmieren, bei dem man einen Ball über irgendwelche Balken oder so balancieren muss mit dem Accelerometer, also das Gerät vor sich gerade hält und je nachdem wie mans kippt rollt der Ball.
Nur leider dreht sich die App ständig, wenn man das Gerät zu weit nach vorne kippt... und dann steht alles auf dem Kopf und anstatt nach unten rollt der Ball nach oben.
Die einzigen paar Antworten die ich mit Google finden kann, erwähnen immer man müsste nur im AndroidManifest.xml unter
Code:
<Activity 
...
android:screenOrientation="landscape">
auf "landscape" oder "portrait" setzen was ich schon habe.
Scheint bei allen zu klappen ausser bei mir und ich habe absolut keine Ahnung warum... kann es sein dass das bei manchen Geräten einfach ignoriert wird?
Noch eine weitere Lösung wäre angeblich:
Code:
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
im XML einzutragen und dann
Code:
void  onConfigurationChanged(Configuration config)
zu overriden. Nur wird die Methode anscheinend nie aufgerufen. Wenn ich einen Breakpoint darin setze wird der jedenfalls nie getriggert.

Es gibt zwar auch screenOrientation "lock", da funktioniert es zwar so wie ich es will, heisst es dreht sich nicht mehr, nur leider ist es dann in portrait mode, bzw in der jeweiligen "nativen Orientation" des jeweiligen Gerätes nehme ich an (hab nur eins zum Testen).
Ich würde also gerne landscape und lock kombinieren, geht das irgendwie oder kann ich mir die Idee gleich wieder aus dem Kopf schlagen?

Also ich habe bei mir in der manifest.xml die orientation auf landscape
Und configChanges orientation angegeben.
die methode onConfigurationChanged habe ich nicht ueberschrieben.
das display bleibt auf landscape und dreht sich nicht auf reverse.
weiss nicht ob es bei dir klappt, kannst sonst mal meine app ausprobieren,
Obs sich auf deinem geraet dreht, faend ich auch interessant zu wissen ;)
 
Glaube das liegt tatsächlich am Fire, hab mir zum testen mal "Crazy Labyrinth 3D Lite" runtergeladen, was fast genau das ist was ich auch vorhatte und da dreht sich der Screen auch mit. Aber komischerweise nicht immer. Irgendwie wird das spontan beim App-Start entschieden :|
Kannst mir gerne auch mal deine App schicken dann sag ich dir Bescheid ob sichs bei mir dreht, gehe aber mal stark davon aus.
 
In meiner signatur ist ein link zum thema mit download
und im entwickler club findest du den code dazu ;)
 
Hab deine App gerade bei mir getestet und jup, es dreht sich auf den Kopf wenn ich das Tablet kippe. Hin und her, hin und her ;)
Scheint wohl bei den Kindle Tablets tatsächlich nicht anders zu gehen.
 

Ähnliche Themen

S
Antworten
33
Aufrufe
2.674
Sempervivum
S
C
Antworten
3
Aufrufe
935
sportspirit
sportspirit
K
Antworten
1
Aufrufe
807
swa00
swa00
Zurück
Oben Unten