2013-03-26 19 views
7

Ich muss eine App machen Video mit einer Taste für den Vollbildmodus auf dem Video. Mit der Taste wird manuell zwischen Querformat und Hochformat der Videoanzeige umgeschaltet. Wir möchten die automatische Rotationserkennung nicht durchführen. Also die Manifest-Datei ist wie folgt eingestellt.Android: Manuelle Bildschirmausrichtung ohne Neustart der Aktivität?

<activity 
    android:name=".VideoActivity" 
    android:screenOrientation="portrait" 
    android:configChanges="keyboardHidden"/> 

I verwendet

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); oder setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);

die Ausrichtung manuell eingestellt. Es funktioniert, aber es startet die Aktivität neu - die onCreate() wurde aufgerufen. Die Video-Wiedergabe startet also unerwartet von vorne. Ich kann es nicht so glatt machen wie mit - die automatische Rotationserkennungsmethode.

Wie kann man die manuelle Bildschirmausrichtung ändern, ohne die Aktivität neu zu starten?

Vielen Dank.

+0

Sie können nicht. Es ist wie das System funktioniert. Es muss viel arbeiten und zerstört die Aktivität, um sie neu zu erstellen. –

+0

Bitte beachten Sie folgendes: http://stackoverflow.com/questions/8032475/oncreate-is-called-twice-after-the-device-is-rotated –

Antwort

5

Für manaul Orientierungsänderung:

<activity 
    android:name=".VideoDetails" 
    android:configChanges="orientation"/> 

public class VideoDetails extends Activity { 
    ... 
    onStart() { 
     setRequestedOrientation(orientation); 
    } 
    onConfigurationChanged(Configuration newConfig){ 
     // do stuff for orientation change. 
    } 
    onClick() { 
     setRequestedOrientation(orientation); 
    } 
} 

Für die automatische Ausrichtung erkennen:

<activity 
    android:name=".VideoDetails" 
    android:configChanges="orientation"/> 

public class VideoDetails extends Activity { 
    ... 
    onConfigurationChanged(Configuration newConfig){ 
     // do stuff for orientation change. 
    } 
} 
1

starten, indem Sie die android:configChanges Knoten zu Ihrem Activity's manifestieren Knoten

android:configChanges="keyboardHidden|orientation" 

Weitere Informationen erhalten Sie this Link

+0

Danke. Ihre Methode scheint automatisch eine Orientierungsänderung durch das System zu erkennen. Es kann verhindern, dass die Aktivität neu gestartet wird. Aber ich möchte nicht automatisch erkennen. Ich brauche manuelle Einstellung. – user1835097

+0

@ user1835097 dann können Sie durch Überschreiben Activity.onConfigurationChanged – Janmejoy

+0

@ user1835097 diesen Link http://c0deattack.wordpress.com/2010/12/25/dealing-with-screen-orientation-changes-manual/ – Janmejoy

2

http://developer.android.com/guide/topics/resources/runtime-changes.html. Sie können auf den Link unter der Überschrift Handhabung eine Suche haben die Konfiguration ändern Yourself

<activity android:name=".MyActivity" 
     android:configChanges="orientation|keyboardHidden" 
     android:label="@string/app_name"> 

Wenn nun eine dieser beiden Konfigurationen ändern, MyActivity nicht neu gestartet. Stattdessen erhält MyActivity einen Aufruf von onConfigurationChanged(). Diese Methode wird an ein Configuration-Objekt übergeben, das die neue Gerätekonfiguration angibt.

android:configChanges="orientation|screenSize" (andorid 3.2 and above screen size also changes. add this) 

Angenommen, Ihr Video dauert 10 Minuten. Das Video wird bis zu 5 Minuten abgespielt und die Ausrichtung ändert sich. Sie wissen, dass es bis zu 5 Minuten gespielt hat.

Sie können den aktuellen Fortschritt des Videos in onSaveInstanceState() speichern und die gespeicherten Daten in onRestoreInstanceState() aus dem Bundle abrufen, danach können Sie die Wiedergabe entweder mit den Fortschrittsdaten oder von Anfang an starten, falls vorhanden keine Daten gespeichert

Wenn die Ausrichtung geändert wird, wird die Aktivität zerstört und neu erstellt. Wenn Sie möchten, Daten speichern und behalten können Sie für das Speichern von großer Menge von Daten, wie unten tun

@Override 
public Object onRetainNonConfigurationInstance() { 
final MyDataObject data = collectMyLoadedData(); 
return data; 
} 


@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance(); 
if (data == null) { 
    data = loadMyData(); 
} 

} 

Für kleine Menge von Daten

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
super.onSaveInstanceState(savedInstanceState); 
// Save UI state changes to the savedInstanceState. 
// This bundle will be passed to onCreate if the process is 
// killed and restarted. 
savedInstanceState.putString("NICK_NAME", Name);//save nick name 
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
super.onRestoreInstanceState(savedInstanceState); 
// Restore UI state from the savedInstanceState. 
// This bundle has also been passed to onCreate. 
Name = savedInstanceState.getString("NICK_NAME");//restore nick name 
} 

Orientierung Um zu überprüfen,

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
super.onConfigurationChanged(newConfig); 

// Checks the orientation of the screen 
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
    Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
    Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
} 
} 

VideoView in Android. In diesem Fall wird auch Video vom Server gestreamt. Überprüfen Sie die angenommene Antwort (Commonsware-Antwort). Genau das gleiche habe ich vorgeschlagen.

+0

Vielen Dank. Ihre Methode der Verwendung von 'onSaveInstanceState()' und 'onRestoreInstanceState()' ist eine der Lösungen. Aber mein Anliegen ist die reibungslose Videowiedergabe, da meine App Videostreaming vom Server abspielt. Die Wiederverbindungs- und Video-Suchzeit würde die Video-Wiedergabe diskontinuierlich machen. – user1835097

+0

@ user1835097 Überprüfen Sie den letzten Link. Der Benutzer streamt auch Videos vom Server. Überprüfen Sie die akzeptierte Antwort. – Raghunandan

0

"android:configChanges="keyboard|keyboardHidden|orientation|screenSize|navigation" for your activity in Manifest.xml, 

Tag hinzufügen und die Methode außer Kraft setzen

public void onConfigurationChanged(Configuration newConfig) {} 

Wenn Sie Ihr Layout auf orientationChange Chek diese replace layout on orientation change

0

Mit der App Neustart nach Orientierungsänderung ändern müssen ist unvermeidbar.

die Variable Halten Sie sich auf Video-Status auf Anwendung bezogen, so dass die Aktivität nicht neu startet die Wiedergabe am Beginn.

Dieser Code ist aus einer Probe app ich diese Antwort zu testen gemacht.

public class MyApplication extends Application { 
int counter; 
@Override 
public void onCreate() { 
    super.onCreate(); 
    counter = 0; 
    } 
} 

die Anwendung auf Ihrem Manifest hinzufügen

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" 
    android:name="com.example.orientationchange.MyApplication" > 
    <activity 
... 

Verwenden withing Aktivität:

public class MainActivity extends Activity { 

TextView output; 
MyApplication app ; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    app = (MyApplication) getApplication(); 
    setContentView(R.layout.activity_main); 
    output = (TextView) findViewById(R.id.output); 
    //A counter thread used to test the solution. 
    new CounterTask().execute(100); 
} 
... 

Nun ist die Rotation nicht die Statusvariablen nicht reinigen.

Alternativ können Sie Einstellungen verwenden für eine Code-schwere Lösung, den Zustand zu erhalten. Die Einstellungen werden auch den Zustand von einer Nutzung der App zum anderen erinnern, wo der Anwendungszustand onDestroy gereinigt() der App.