Portrait/Landscape wechsel für kurze Zeit verbieten

  • Antworten:14
Gelöschter Account
  • Forum-Beiträge: 2.492

17.03.2014, 14:25:30 via Website

Hallo,
ich möchte meiner App das switchen zwischen Landscape und Portrait nicht komplett verbieten jedoch: wenn der Nutzer einmal angefangen ist mit einer Texteingabe soll es fix sein bis zum Ende und man kann nicht mehr wechseln egal wie man das Handy hält.
Gibt es eine Möglichkeit zu sagen: Ab jetzt Portrait/Landscape Wechsel = aus ... Ab jetzt Portrait/Landscape Wechsel = an.
Ich habe bisher nur von Möglichkeiten gelesen die alle als "unschön" beschrieben werden. Gibt es auch "schöne" Möglichkeiten :D

Gruß
Lars

Antworten
impjor
  • Forum-Beiträge: 1.793

17.03.2014, 14:58:02 via Website

Warum willst du das tun? (Das ist das unschöne: Die ganze Aktion ist unschön. :))
Statt das Rotieren zu verbieten solltest du lieber den Text zwischenspeichern und nach dem drehen wieder einfügen.

Wenn es wirklich einen triftigen Grund gibt, dass die Rotation gesperrt werden soll, kannst du einfach die aktuelle bestimmen und dann nur noch diese zu lassen.

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

17.03.2014, 15:27:52 via Website

Schön ist nicht dem user zu verbieten was er zu tun oder zu lassen hat, und nur kleinbürgerlich zu denken man hat die weißheit mit löffeln gefressen! Es gibt gefühlt 5000+ geräte und wenn einer in Landscape oder wie auch immer einen Text eingeben will ist das seine sache. Dabei ist die sache trivial und der Text wird vom Framework sofern du eine ID im XML deiner TextiView vergeben hast für dich gespeichert und wieder gelesen. Aufwand ist dabei null.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

17.03.2014, 21:37:46 via Website

Achso also sollte ich es vielleicht so lassen :)
Ich rufe in der onCreate eine Methode auf die einen zufälligen Text in einem TextView erstellt. Dann muss ich warhscheinlich den Text in den SharedPrefs speichern und dann wieder laden. Einfacher geht es nicht oder?

@Mac: Das geht in meinem Fall dann nicht oder?

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

18.03.2014, 01:42:28 via Website

Dem system ist das egal, nutze einfach den setter auf dem TextView und es sollte passen :)

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

18.03.2014, 09:10:48 via Website

Das verstehe ich nicht. Was für eine ID meinst du und was für einen setter?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

18.03.2014, 13:19:49 via Website

Die id "@id" element in der XMl

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

18.03.2014, 13:28:05 via Website

Ja die habe ich gesetzt, aber der Text ändert sich immer

— geändert am 18.03.2014, 13:28:24

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

18.03.2014, 13:36:42 via Website

Wie der Ändert sich immer? Zeig mal bitte den Code

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

18.03.2014, 13:54:49 via Website

Mein TextView:
1<TextView
2 android:id="@+id/tvText"
3 android:layout_width="match_parent"
4 android:layout_height="wrap_content"
5 android:text="" />

Die onCreate:
1protected void onCreate(Bundle savedInstanceState) {
2 // TODO Auto-generated method stub
3 super.onCreate(savedInstanceState);
4 setContentView(R.layout.layout);
5
6 ausgabe = (TextView) findViewById(R.id.tvText);
7
8 Schriftart = Typeface.createFromAsset(this.getAssets(), "Ledger-Regular.ttf");
9 ausgabe.setTypeface(Schriftart);
10 ausgabe.setTextColor(Color.BLACK);
11 ausgabe.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);
12
13 //Der zufällige Text im TextView ausgabe wird erstellt
14 TextErstellen();
15}

— geändert am 18.03.2014, 13:57:46

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

19.03.2014, 10:03:41 via Website

Wo muss ich die dann speichern und wieder laden (also die Methoden aufrufen)? In der onCreate?
Edit: Achso die muss man gar nicht aufrufen das wird so gespeichert und geladen ;)

Ein anderes Problem ist dann aber das ich ein Timer laufen habe, und der läuft dann einmal im Portrait Modus und noch einmal getrennt im Landscape Modus. (Bei Eingabe in ein EditText (fange ich mit onTextChanged ab) startet der Timer)
1private void SpielStart() {
2 // TODO Auto-generated method stub
3 new CountDownTimer(20000, 1000) {
4
5 public void onTick(long millisUntilFinished) {
6 zeit.setText("Schnell nur noch: " + millisUntilFinished / 1000 + " Sekunden!");
7 }
8
9 public void onFinish() {
10 zeit.setText("Ende!");
11 }
12 }.start();
13 }

— geändert am 19.03.2014, 10:24:44

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

19.03.2014, 11:48:16 via Website

So ist das mit Timern/AsyncTasks, du müsst dich darum kümmern das diese bei rotation beendet und wieder richtig gestartet werden.
Wenn du ein paar mal zu viel drehst, wird die Activity geleakt, da dein Timer eine referenz auf eine alte Activity hat, was zum crash führt.

Meist ist es gut wenn du deinen Timer auslagerst, zumindest das wird dir helfen solche Probleme zu vermeiden.
Dafür könnte man z.b WeakReference<TextView> benutzen um das TextField zu halten, somit hat der GC die change die sachen wergzuwerfen. Wirklich cooles
design ist das bei weiten noch nicht aber wäre ein Anfang. Den Timer Stopen und neu starten kann man recht einfach indem man in den onSavedInstanceState einfach die werte bei onSaveInstanceState hinterlegt die der Timer gerade hatte und macht entsprechend weiter. Ist wirklich kein Hexenwerk

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

19.03.2014, 12:13:20 via Website

Der obere Teil hört sich für mich leider sehr unbekannt und kompliziert an.
Also die millisUntilFinished auch mit putInt() speichern und laden und in der onTick dann auf diese zugreifen? Also steht da dann nicht onTick(long millisUntilFinished) sondern onTick(millisUntilFinished)?

Edit: Also anscheinend muss da
1public void onTick(long millisUntilFinished)
stehen wenn ich long wegmache steht da nämlich
Syntax error on token "millisUntilFinished", VariableDeclaratorId expected after this token

— geändert am 19.03.2014, 13:03:46

Antworten
Andreas S.
  • Forum-Beiträge: 76

19.03.2014, 21:18:53 via Website

Bezüglich AsyncTask ist das hier sehenswert:

http://blog.callumtaylor.net/handlingasynctasksanddialogfragmentswithorientationchangingjava-android

Und hier für das Speichern und Laden des Textes beim Orientierungswechsel (irgendwie wird das komisch formatiert):

1private static final String CONTENT = "key";
2
3@Override
4public void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.layout);
7
8 ausgabe = (TextView) findViewById(R.id.tvText);
9
10 Schriftart = Typeface.createFromAsset(this.getAssets(), "Ledger-Regular.ttf");
11 ausgabe.setTypeface(Schriftart);
12 ausgabe.setTextColor(Color.BLACK);
13 ausgabe.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);
14
15 if (savedInstanceState == null)
16 TextErstellen();
17 else
18 ausgabe.setText(savedInstanceState.getString(CONTENT));
19 }
20
21 @Override
22 public void onSaveInstanceState(Bundle outState) {
23 outState.putString(CONTENT, ausgabe.getText().toString());
24 super.onSaveInstanceState(outState);
25 }

— geändert am 19.03.2014, 21:34:18

Antworten