2012-10-25 26 views
6

मैंने कॉन्फ़िगरेशन परिवर्तनों को संभालने के लिए गतिविधि सेट की है और यह काम करता है, जिसका अर्थ है कि को ओरिएंटेशन बदलते समय कहा जाता है।ऑन कॉन्फ़िगरेशन चेंज को एक बार सेट नहीं किया गया है, अनुरोध किया गया है कॉन्फ़िगरेशन

गतिविधि में स्पष्ट रूप से अभिविन्यास को बदलने के लिए एक बटन है। क्लिक करने पर, इसे setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT) कहा जाता है।

फिर अभिविन्यास अपरिवर्तनीय सेट है और अब और नहीं कहा जाता है।

कॉलबैक खोने के दौरान जब उपयोगकर्ता बटन क्लिक करता है तो मैं अभिविन्यास कैसे बदल सकता हूं?

उत्तर

4

यह की जरूरत नहीं है, तो मैं इसे हल कैसे किया है। मुझे पता है कि यह पहिया को फिर से शुरू कर रहा है लेकिन यह मेरी आवश्यकता को पूरा करता है और मुझे मानक एसडीके उपकरणों के साथ इसे संभालने का उचित तरीका नहीं मिला।

सबसे पहले, एक OrientationManager वर्ग कि उन्मुखीकरण को सुनने के बनाने में परिवर्तन

public class OrientationManager extends OrientationEventListener{ 
private static final String TAG = OrientationManager.class.getName(); 

private int previousAngle; 
private int previousOrientation; 
private Context context; 
private OrientationChangeListener orientationChangeListener; 
private static OrientationManager instance; 
private OrientationManager(Context context) { 
    super(context); 
    this.context = context; 
} 

public static OrientationManager getInstance(Context context){ 
    if (instance == null){ 
     instance = new OrientationManager(context); 
    } 
    return instance; 
} 

public int getOrientation(){ 
    return previousOrientation; 
} 

public void setOrientation(int orientation){ 
    this.previousOrientation = orientation; 
} 


@Override 
public void onOrientationChanged(int orientation) { 
    if (orientation == -1) 
     return; 
    if(previousOrientation == 0){ 
     previousOrientation = context.getResources().getConfiguration().orientation; 
     if (orientationChangeListener != null){ 
      orientationChangeListener.onOrientationChanged(previousOrientation); 
     }   
    } 
    if (previousOrientation == Configuration.ORIENTATION_LANDSCAPE && 
      ((previousAngle > 10 && orientation <= 10) || 
      (previousAngle < 350 && previousAngle > 270 && orientation >= 350))){ 
     if (orientationChangeListener != null){ 
      orientationChangeListener.onOrientationChanged(Configuration.ORIENTATION_PORTRAIT); 
     } 
     previousOrientation = Configuration.ORIENTATION_PORTRAIT; 
    } 

    if (previousOrientation == Configuration.ORIENTATION_PORTRAIT && 
      ((previousAngle <90 && orientation >= 90 && orientation <270) || 
      (previousAngle > 280 && orientation <= 280 && orientation > 180)) ){ 
     if (orientationChangeListener != null){ 
      orientationChangeListener.onOrientationChanged(Configuration.ORIENTATION_LANDSCAPE); 
     } 
     previousOrientation = Configuration.ORIENTATION_LANDSCAPE; 
    } 
    previousAngle = orientation; 
} 

public void setOrientationChangedListener(OrientationChangeListener l){ 
    this.orientationChangeListener = l; 
} 

public interface OrientationChangeListener{ 
    public void onOrientationChanged(int newOrientation); 
} 
} 

फिर अपनी गतिविधि में OrientationChangeListener को लागू करने और onOrientationChanged() ओवरराइड:

public class MyActivity extends Activity implements OrientationChangeListener{ 

    private OrientationManager orientationManager; 

    @Override 
    public void onCreate(Bundle b){ 
     orientationManager = OrientationManager.getInstance(this); 
     orientationManager.setOrientationChangedListener(this); 

    } 

@Override 
public void onOrientationChanged(int newOrientation) { 
    orientation = newOrientation; 
    if (newOrientation == Configuration.ORIENTATION_LANDSCAPE){ 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
     setLandscapeConfig(); 
    }else{ 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     setPortraitConfig(); 
    } 
} 

तो मैं onConfigurationChanged अब और का उपयोग नहीं करते लेकिन रखना मेनिफेस्ट में निम्न पंक्ति: एंड्रॉइड: configChanges = "ओरिएंटेशन | स्क्रीनसाइज"

+0

अपने समाधान को कार्यान्वित करें लेकिन ऑनऑरेंटेशन पर जब मैं डिवाइस को घुमाता हूं तो कभी भी कॉल नहीं किया जाता है। कोई विचार? – Codebeat

+0

ठीक है, गतिविधि कन्स्ट्रक्टर में orientationManager.enable() को कॉल करना होगा! – Codebeat

1
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT) 

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

android:configChanges="orientation|screenSize" 

screenSize विशेषता केवल API 13+ के लिए है ताकि नीचे अपना, आप इसे

+0

यह पहले से ही मैनिफेस्ट में है, अन्यथा कॉन्फ़िगरेशन चेंजड – znat

+0

@NathanZ पर काम नहीं करेगा क्या आपने इसे हल किया है, मुझे एक ही समस्या का सामना करना पड़ रहा है। – dreamtale

+0

हाँ मैंने किया। मेरा उत्तर देखें – znat

2

कॉलिंग setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);onConfigurationChanged को पुनः सक्रिय करेगा। आप इस प्रकार का टाइमर सेट कर सकते हैं:

// Force orientation to portrait 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 

// Reactivate sensor orientation after delay 
Timer mRestoreOrientation = new Timer(); 
mRestoreOrientation.schedule(new TimerTask() { 
    @Override 
    public void run() { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
    } 
}, 2000); 

हम केवल उपयोगकर्ता देरी भीतर मजबूर उन्मुखीकरण के लिए खुद से डिवाइस हो जाएगा लगता है सकते हैं, और यह खराब उपयोगकर्ता अनुभव हो सकता है।

+0

ActivityInfo.SCREEN_ORIENTATION_SENSOR ने मेरे लिए काम किया। – Harry

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