2013-03-26 31 views
7

Potrzebuję zrobić aplikację do odtwarzania wideo za pomocą przycisku na pełnym ekranie na wideo. Przycisk służy do ręcznego przełączania między krajobrazem a portretem wyświetlacza wideo. Nie chcemy wykrycia automatycznego obracania. Tak więc plik manifestu jest ustawiony jak poniżej.Android: ręczna orientacja ekranu bez ponownego uruchamiania działania?

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

kiedyś

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

ręcznie ustawić orientację. Działa, ale ponownie uruchamia działanie - wywołano funkcję onCreate(). Tak więc odtwarzanie wideo rozpoczyna się nieoczekiwanie od początku. Nie mogę sprawić, by było tak gładko jak w przypadku korzystania z metody automatycznego wykrywania rotacji.

Jak dokonać ręcznej zmiany orientacji ekranu bez ponownego uruchamiania czynności?

Dziękuję.

+0

Nie możesz. Jak działa ten system. Musi ponownie wykonać dużo pracy i po prostu niszczy działanie, aby je odtworzyć. –

+0

Proszę odnieść się do tego: http://stackoverflow.com/questions/8032475/oncreate-is-called-twice-after-the-device-is-rotated –

Odpowiedz

5

Dla manaul zmiany orientacji:

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

do automatycznego wykrywania orientacji:

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

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

start dodając do Activity's oczywistego węzła

android:configChanges="keyboardHidden|orientation" 

Więcej informacji węzeł android:configChanges sprawdzić this odnośnik

+0

Dzięki. Twoja metoda wydaje się być automatycznie rozpoznawana przez system. Może zapobiec ponownemu uruchomieniu działania. Ale nie chcę automatycznego wykrywania. Potrzebuję zestawu ręcznego. – user1835097

+0

@ user1835097 możesz to zrobić, przesuwając Activity.onConfigurationChanged – Janmejoy

+0

@ user1835097 sprawdź ten link http://c0deattack.wordpress.com/2010/12/25/dealing-with-screen-orientation-changes-manually/ – Janmejoy

2

http://developer.android.com/guide/topics/resources/runtime-changes.html. można mieć patrząc na link pod nagłówkiem Handling Configuration zmienić siebie

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

Teraz, gdy jeden z tych składów zmienić, MyActivity nie restart. Zamiast tego MyActivity odbiera wywołanie onConfigurationChanged(). Ta metoda jest przekazywana do obiektu Configuration, który określa nową konfigurację urządzenia.

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

Załóżmy, że Twoje wideo ma 10 minut. Film jest odtwarzany do 5 minut i zmiany orientacji, wiesz, że grał do 5 minut.

Możesz zapisać rzeczywisty postęp wideo w trybie onSaveInstanceState() i uzyskać zapisane dane w onRestoreInstanceState() z Pakietu, po czym możesz rozpocząć grę z danymi postępu lub od początku, jeśli było żadne dane nie zostały zapisane.

Po zmianie orientacji działanie jest niszczone i odtwarzane. Jeśli chcesz, aby zapisać dane i zachowują można zrobić jak poniżej do zapisywania duży zestaw danych

@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(); 
} 

} 

Dla małego zbioru danych

@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 
} 

Aby sprawdzić orientacja

@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. W takim przypadku wideo jest przesyłane strumieniowo z serwera. Sprawdź, czy odpowiedź została zaakceptowana (odpowiedź typu commonsware). Dokładnie tak samo sugerowałem.

+0

Dzięki. Twoja metoda używania 'onSaveInstanceState()' i 'onRestoreInstanceState()' jest jednym z rozwiązań. Moją obawą jest jednak płynność odtwarzania wideo, ponieważ moja aplikacja odtwarza strumieniowo wideo z serwera. Ponowne podłączenie i czas wyszukiwania filmu sprawią, że odtwarzanie wideo będzie nieciągłe. – user1835097

+0

@ user1835097 sprawdź ostatnie łącze. Użytkownik przesyła strumieniowo wideo z serwera. sprawdź zaakceptowaną odpowiedź. – Raghunandan

0

Dodaj tag

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

i zastąpić metodę

public void onConfigurationChanged(Configuration newConfig) {} 

Jeśli trzeba zmienić układ na orientationChange Chek tej jednej replace layout on orientation change

0

Mając aplikację restart po zmianie orientacji jest nieuniknione.

Zachowaj zmienną związaną ze statusem wideo w aplikacji, aby działanie nie wznowiło odtwarzania na początku.

Ten kod pochodzi z przykładowej aplikacji, którą przetestowałem, aby przetestować tę odpowiedź.

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

dodać aplikację na swoim oczywistym

<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 
... 

Zastosowanie withing Aktywny:

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

Teraz obrót nie oczyścić zmiennych stanu.

Alternatywnie można użyć Preferencji w celu uzyskania rozwiązania bardziej obciążającego kod w celu zachowania stanu. Preferencje będą również pamiętać stan z jednego użycia aplikacji na inny, gdzie stan aplikacji jest czyszczony onDestroy() aplikacji.