android - एंड्रॉइड: टैबलेट के लिए पोर्ट्रेट और लैंडस्केप की इजाजत देता है,




tablet screen-orientation (6)

मैं टैबलेट को पोर्ट्रेट और लैंडस्केप (sw600dp या इससे अधिक) में प्रदर्शित करने में सक्षम होना चाहता हूं, लेकिन फोन केवल पोर्ट्रेट तक ही सीमित है। मुझे सशर्त रूप से अभिविन्यास चुनने का कोई तरीका नहीं मिल रहा है। कोई सुझाव?


स्वीकृत उत्तर के लिए पूरक

आप अपने bools.xml फ़ाइलों के साथ res/values-sw600dp और res/values-large bools.xml निर्देशिका जोड़ने के लिए एंड्रॉइड स्टूडियो में निम्न चरणों को कर सकते हैं।

मान-sw600dp

सबसे पहले, प्रोजेक्ट टैब से नेविगेटर में प्रोजेक्ट (एंड्रॉइड के बजाए) फ़िल्टर का चयन करें।

फिर app/src/main/res निर्देशिका पर राइट क्लिक करें। नई > एंड्रॉइड संसाधन निर्देशिका चुनें।

सबसे छोटी स्क्रीन चौड़ाई का चयन करें, और फिर >> बटन दबाएं।

सबसे छोटी स्क्रीन चौड़ाई के लिए 600 में टाइप करें। निर्देशिका का नाम स्वचालित रूप से जेनरेट हो जाएगा। ठीक है बोलो।

फिर नव निर्मित values-sw600dp फ़ाइल पर राइट क्लिक करें। नया > मान संसाधन फ़ाइल चुनें। नाम के लिए bools टाइप करें।

मान-बड़े

एक values-large जोड़ना values-large निर्देशिका केवल तभी जरूरी है जब आप प्री एंड्रॉइड 3.2 (एपीआई लेवल 13) का समर्थन कर रहे हों। अन्यथा आप इस चरण को छोड़ सकते हैं। values-large निर्देशिका values-sw600dp मेल खाती है। ( values-sw720dp values-xlarge values-sw720dp मेल values-sw720dp ।)

values-large को बनाने के लिए values-large निर्देशिका, ऊपर दिए गए चरणों का पालन करें, लेकिन इस मामले में सबसे छोटी स्क्रीन चौड़ाई के बजाय आकार चुनें। बड़ा चुनें। निर्देशिका का नाम स्वचालित रूप से जेनरेट हो जाएगा।

bools.xml फ़ाइल बनाने के लिए पहले निर्देशिका के रूप में राइट क्लिक करें।


आप इस तरह से डिवाइस के स्क्रीन आकार को पहले प्राप्त करने का प्रयास कर सकते हैं

if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {     
    Toast.makeText(this, "Large screen",Toast.LENGTH_LONG).show();

}
else if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {     
    Toast.makeText(this, "Normal sized screen" , Toast.LENGTH_LONG).show();

} 
else if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {     
    Toast.makeText(this, "Small sized screen" , Toast.LENGTH_LONG).show();
}
else {
    Toast.makeText(this, "Screen size is neither large, normal or small" , Toast.LENGTH_LONG).show();
}

और उसके बाद अभिविन्यास सेट करें

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

दुर्भाग्यवश, विधि setRequestedOrientation(...) का उपयोग गतिविधि को पुनरारंभ करने का कारण बनता है, इसलिए यदि आप इसे ऑनक्रेट विधि में कॉल करते हैं, तो यह गतिविधि जीवन चक्र के माध्यम से जाएगा और फिर यह अनुरोधित अभिविन्यास में एक ही गतिविधि को फिर से बनाएगा। तो @ ब्रायन क्रिस्टेनसेन के जवाब पर आपको यह समझना चाहिए कि गतिविधि कोड को दो बार बुलाया जा सकता है, इससे बुरा प्रभाव हो सकता है (न केवल दृश्य, बल्कि नेटवर्क अनुरोधों, विश्लेषण आदि पर भी)।

इसके अलावा, मैनिफेस्ट में configChanges विशेषता सेट करने के लिए मेरी राय में एक बड़ा व्यापार-बंद है, जो बड़े पैमाने पर रिफैक्टरिंग लागत ले सकता है। एंड्रॉइड देव उस विशेषता को बदलने की सिफारिश नहीं कर रहे हैं

आखिरकार, स्क्रीन को सेट करने का प्रयास करना किसी भी तरह से अलग करना (पुनरारंभ करने वाली समस्या से बचने के लिए) असंभव है, स्थैतिक रूप से असंभव है क्योंकि स्थैतिक मैनिफेस्ट को बदला जा सकता है, प्रोग्रामेटिक रूप से पहले से ही शुरू की गई गतिविधि में उस विधि को कॉल करना संभव है।

सारांश: मेरी राय में, @ ब्रायन क्रिस्टेनसेन सुझाव सबसे अच्छा व्यापार-बंद है, लेकिन पुनरारंभ करने वाली गतिविधि के मुद्दे से अवगत रहें।


पुराना सवाल मुझे पता है। अभिविन्यास हो सकता है या स्वैप किया जा सकता है, भले ही आपका ऐप हमेशा पोर्ट्रेट मोड में चलाने के लिए (उदाहरण के लिए टैबलेट पर) मैंने इस फ़ंक्शन को डिज़ाइन किया है जिसका उपयोग डिवाइस को सही अभिविन्यास में सेट करने के लिए किया जाता है, बिना चित्र और परिदृश्य कैसे डिवाइस पर सुविधाओं का आयोजन किया जाता है।

   private void initActivityScreenOrientPortrait()
    {
        // Avoid screen rotations (use the manifests android:screenOrientation setting)
        // Set this to nosensor or potrait

        // Set window fullscreen
        this.activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        DisplayMetrics metrics = new DisplayMetrics();
        this.activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);

         // Test if it is VISUAL in portrait mode by simply checking it's size
        boolean bIsVisualPortrait = ( metrics.heightPixels >= metrics.widthPixels ); 

        if( !bIsVisualPortrait )
        { 
            // Swap the orientation to match the VISUAL portrait mode
            if( this.activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT )
             { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); }
            else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ); }
        }
        else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); }

    }

एक जादू की तरह काम करता है!

नोटिस: अपनी गतिविधि से इस। सक्रियता को बदलें या इसे मुख्य गतिविधि में जोड़ें और इसे हटाएं। this.activity ;-)

यदि आप विपरीत करना चाहते हैं, तो आपको कोड को परिदृश्य में बदलना होगा (लेकिन मुझे लगता है कि यह स्पष्ट है कि यह कैसे करें)।


resources और आकार क्वालीफायरों का उपयोग करके यहां एक अच्छा तरीका है।

इस बूल संसाधन को res / values ​​में bools.xml के रूप में रखें या जो भी हो (फ़ाइल नाम यहां कोई फर्क नहीं पड़ता):

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <bool name="portrait_only">true</bool>
    </resources>

इसे एक res / values-sw600dp में रखें और res / values-xlarge:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <bool name="portrait_only">false</bool>
    </resources>

Android Studio में इन निर्देशिकाओं और फ़ाइलों को जोड़ने में सहायता के लिए यह पूरक उत्तर देखें।

फिर, अपनी गतिविधियों के ऑनक्रेट विधि में आप यह कर सकते हैं:

    if(getResources().getBoolean(R.bool.portrait_only)){
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

डिवाइस जो छोटी चौड़ाई दिशा में 600 डीपी से अधिक हैं, या प्री-एंड्रॉइड 3.2 डिवाइस (टैबलेट, मूल रूप से) पर एक्स-बड़े सेंसर और उपयोगकर्ता लॉक रोटेशन इत्यादि के आधार पर सामान्य की तरह व्यवहार करेंगे। बाकी सब कुछ (फोन, बहुत ज्यादा) केवल चित्र होगा।


गिनी के जवाब के बाद, मुझे लगता है कि ऐसा करने का सबसे विश्वसनीय तरीका निम्नानुसार है:

जैसा कि here वर्णित here , संसाधनों में एक बूलियन डाल दें sw600dp। इसमें उपसर्ग sw होना चाहिए अन्यथा यह ठीक से काम नहीं करेगा:

res / values-sw600dp / dimens.xml में

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="isTablet">true</bool>
</resources>

res / values ​​/ dimens.xml में

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="isTablet">false</bool>
</resources>

फिर उस बूलियन को पुनः प्राप्त करने के लिए एक विधि बनाएं:

public class ViewUtils {
    public static boolean isTablet(Context context){
        return context.getResources().getBoolean(R.bool.isTablet);
    }
}

और उन गतिविधियों से विस्तार करने के लिए एक मूल गतिविधि जहां आप यह व्यवहार चाहते हैं:

public abstract class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (!ViewUtils.isTablet(this)) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    }
}

तो प्रत्येक गतिविधि बेसएक्टिविटी का विस्तार करेगी:

public class LoginActivity extends BaseActivity //....

महत्वपूर्ण : यहां तक ​​कि यदि आप BaseActivity से विस्तार BaseActivity , तो आपको अपने AndroidManifest.xml में प्रत्येक Activity लिए लाइन android:configChanges="orientation|screenSize" :

    <activity
        android:name=".login.LoginActivity"
        android:configChanges="orientation|screenSize">
    </activity>




screen-orientation