2013-03-26 10 views
7

मुझे वीडियो पर पूर्ण स्क्रीन के लिए एक बटन के साथ वीडियो चलाने की आवश्यकता है। वीडियो डिस्प्ले के लैंडस्केप और पोर्ट्रेट के बीच मैन्युअल रूप से स्विच करने के लिए बटन का उपयोग किया जाता है। हम ऑटो रोटेशन का पता नहीं चाहते हैं। तो मैनिफेस्ट फ़ाइल नीचे के रूप में सेट है।एंड्रॉइड: गतिविधि को पुनरारंभ किए बिना मैन्युअल स्क्रीन अभिविन्यास?

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

मैं

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); या setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);

मैन्युअल उन्मुखीकरण स्थापित करने के लिए इस्तेमाल किया। यह काम करता है लेकिन यह गतिविधि को पुनरारंभ करता है - ऑनक्रेट() को बुलाया गया था। तो वीडियो प्लेबैक अप्रत्याशित रूप से शुरुआत से पुनरारंभ होता है। मैं इसे - ऑटो रोटेशन डिटेक्ट विधि का उपयोग करने की तरह चिकनी नहीं बना सकता।

तो गतिविधि को पुनरारंभ किए बिना मैन्युअल स्क्रीन अभिविन्यास परिवर्तन कैसे करें?

धन्यवाद।

+0

आप नहीं कर सकते। यह कैसे प्रणाली काम करता है। इसे फिर से बनाने के लिए, बहुत सारे काम फिर से करना है और गतिविधि को नष्ट कर देना है। –

+0

कृपया इसे देखें: http://stackoverflow.com/questions/8032475/oncreate-is-called-twice-after-the-device-is-rotated –

उत्तर

5

manaul उन्मुखीकरण परिवर्तन के लिए:

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

ऑटो उन्मुखीकरण के लिए पता लगाने:

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

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

प्रारंभ अपने Activity's प्रकट नोड

android:configChanges="keyboardHidden|orientation" 

अधिक जानकारी के लिए के लिए android:configChanges नोड जोड़कर जाँच this लिंक

+0

धन्यवाद। आपकी विधि सिस्टम द्वारा स्वत: पता अभिविन्यास परिवर्तन लगता है। यह गतिविधि को पुनरारंभ करने से रोक सकता है। लेकिन मैं ऑटो डिटेक्ट नहीं चाहता। मुझे मैन्युअल सेट की जरूरत है। – user1835097

+0

@ user1835097 तो आप गतिविधि को ओवरराइड करके कर सकते हैं .ऑन कॉन्फ़िगरेशन चेंज – Janmejoy

+0

@ user1835097 इस लिंक को जांचें 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। आप हैंडलिंग विन्यास बदल खुद

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

अब, जब इन विन्यास में से एक बदलने के लिए, MyActivity पुनः आरंभ नहीं करता है शीर्षक के तहत दिए गए लिंक पर एक की तलाश में हो सकता है। इसके बजाए, माईएक्टिविटी को कॉन्फ़िगरेशन चेंज() पर कॉल प्राप्त होता है। यह विधि कॉन्फ़िगरेशन ऑब्जेक्ट को पास कर दी गई है जो नई डिवाइस कॉन्फ़िगरेशन निर्दिष्ट करती है।

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

मान लीजिए कि आपका वीडियो 10 मिनट है। वीडियो 5 मिनट तक और अभिविन्यास परिवर्तन तक चलता है, आप जानते हैं कि यह 5 मिनट तक खेला गया है।

आप वीडियो की वास्तविक प्रगति को सेवइनस्टेंसस्टेट() में सहेज सकते हैं और सहेजे गए डेटा को बंडल से ऑनस्टोर इंस्टेंसस्टेट() में प्राप्त कर सकते हैं, उसके बाद आप प्रगति डेटा के साथ खेलना शुरू कर सकते हैं, या शुरुआत से ही कोई डेटा सहेजा नहीं गया

जब अभिविन्यास परिवर्तन गतिविधि नष्ट हो जाती है और फिर से बनाई जाती है। आप डेटा को बचाने के लिए और चाहते हैं बनाए रखने यदि आप डेटा

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

} 

के बड़े सेट बचत डेटा

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

के छोटे सेट के लिए उन्मुखीकरण

@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 की जांच करने के लिए नीचे के रूप में कर सकते हैं। इस मामले में भी सर्वर से वीडियो स्ट्रीम किया जाता है। उत्तर स्वीकार किए गए (कॉमन्सवेयर उत्तर) की जांच करें। बिल्कुल वही मैंने सुझाव दिया।

+0

धन्यवाद। 'OnSaveInstanceState()' और 'onRestoreInstanceState()' का उपयोग करने की आपकी विधि समाधानों में से एक है। लेकिन मेरी चिंता वीडियो प्लेबैक की चिकनी है, क्योंकि सर्वर से मेरा ऐप प्लेबैक वीडियो स्ट्रीमिंग है। पुनः कनेक्शन और वीडियो तलाशने का समय वीडियो प्लेबैक को बंद कर देगा। – user1835097

+0

@ user1835097 अंतिम लिंक देखें। उपयोगकर्ता सर्वर से वीडियो स्ट्रीमिंग भी कर रहा था। स्वीकृत उत्तर की जांच करें। – Raghunandan

0

टैग

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

जोड़े और ओवरराइड विधि

public void onConfigurationChanged(Configuration newConfig) {} 

आप ऑरिएंटेशन बदलने एप्लिकेशन को पुनः आरंभ करने के बाद chek यह एक replace layout on orientation change

0

orientationchange पर अपने लेआउट बदलने के लिए की जरूरत है अपरिहार्य है।

एप्लिकेशन पर वीडियो स्थिति से संबंधित चर रखें ताकि गतिविधि शुरू में प्लेबैक को पुनरारंभ न करे।

यह कोड नमूना ऐप से है जो मैंने इस उत्तर का परीक्षण करने के लिए किया है।

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

अपने प्रकट

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

उपयोग के भीतर गतिविधि पर आवेदन करें:

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

अब रोटेशन स्थिति चर साफ नहीं है।

आप वैकल्पिक रूप से राज्य को संरक्षित करने के लिए एक और कोड-भारी समाधान के लिए प्राथमिकताएं उपयोग कर सकते हैं। वरीयताएं ऐप के एक प्रयोग से दूसरे राज्य को भी याद रखेगी, जहां एप्लिकेशन की स्थिति ऐप के डेस्ट्रॉय() पर साफ की जाती है।

संबंधित मुद्दे