سؤال

لدي تطبيق أرغب في استخدامه في وضع عمودي، لذلك قمت بتعريف Android: ScreenOrientation = "صورة" في البيان XML. هذا يعمل موافق ل HTC Magic. الهاتف (ويمنع التغييرات التوجيهية على هواتف أخرى كذلك).

ولكن لدي مشكلة مع HTC G1. الهاتف كما أفتح الأجهزة لوحة المفاتيح QWERTY (وليس لوحة المفاتيح الافتراضية). يبقى نشاطي في وضع عمودي، ولكن يبدو أنه يتم إعادة تشغيله ويخسر جميع دوله. هذا لا يحدث مع HTC Hero. الإصدار.

طلبي كبير جدا، لذلك لا أريد إعادة تشغيله وفقدان جميع حالاته عند فتح لوحة المفاتيح. كيف يمكنني منع ذلك؟

هل كانت مفيدة؟

المحلول

تحديث أبريل 2013: لا تفعل هذا. لم تكن فكرة جيدة في عام 2009 عندما أجبت على السؤال لأول مرة وهي ليست فكرة جيدة الآن. انظر هذا الجواب بواسطة Hackbod لأسباب:

تجنب إعادة تحميل النشاط مع تغيير ASYNCTASK للتوجيه في Android

يضيف android:configChanges="keyboardHidden|orientation" إلى Androidmanifest.xml. يخبر هذا النظام عن تغييرات التكوين التي ستعالجها بنفسك - في هذه الحالة من خلال عدم القيام بأي شيء.

<activity android:name="MainActivity"
     android:screenOrientation="portrait"
     android:configChanges="keyboardHidden|orientation">

انظر المرجع المطور configchanges. لمزيد من التفاصيل.

ومع ذلك، يمكن مقاطعة طلبك في أي وقت، على سبيل المثال عن طريق مكالمة هاتفية، لذلك يجب عليك حقا إضافة رمز لحفظ حالة طلبك عند إيقاف تشغيله.

تحديث: اعتبارا من Android 3.2، تحتاج أيضا إلى إضافة "Scalensize":

<activity
    android:name="MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="keyboardHidden|orientation|screenSize">

من دليل المطور التعامل مع التكوين تغيير نفسك

تحذير: بدءا من Android 3.2 (API المستوى 13)، يتغير أيضا "حجم الشاشة" أيضا عند مفاتيح الجهاز بين Portrait واتجاه المناظر الطبيعية. وبالتالي، إذا كنت ترغب في منع إعادة تشغيل وقت التشغيل نظرا للتغيير التوجيه عند تطوير المستوى API 13 أو أعلى (كما أعلن عن سمات MinsDkVersion و BergerSsDKVersion)، يجب عليك تضمين قيمة "الشاشة" بالإضافة إلى قيمة "الاتجاه". وهذا هو، يجب أن تعلن android:configChanges="orientation|screenSize". وبعد ومع ذلك، إذا كان التطبيق الخاص بك يستهدف API المستوى 12 أو أقل، فإن نشاطك يعمل دائما على تغيير هذا التكوين نفسه (لا يؤدي تغيير التكوين هذا إلى إعادة تشغيل نشاطك، حتى عند التشغيل على جهاز Android 3.2 أو أعلى).

نصائح أخرى

تحتاج إلى تعديل Androidmanifest.xml كما المعدات (سابقا أشتون) المذكورة وتأكد من أن النشاط يتعامل مع الحدث OnConfigurationChanged كما تريد التعامل معه. هكذا المفروض ان يظهر:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

لقد وجدت دائما أنك تحتاج كلاهما

android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"

كما قال، مجموعة android:configChanges من نشاطك (في ملف بيان) إلى keyboardHidden|orientation وثم:

1) تجاوز onConfigurationChanged()

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //here you can handle orientation change
}

2) أضف هذا الخط إلى نشاطك onCreate()

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

إنه أفضل من إضافة نفس الخط إلى onConfigurationChanged, ، لأن تطبيقك سوف يتحول إلى وضع عمودي ثم العودة إلى المناظر الطبيعية (سيحدث مرة واحدة فقط، لكنه مزعج).

كما يمكنك ضبط android:screenOrientation="nosensor" لنشاطك (في بيان). ولكن باستخدام بهذه الطريقة أنك غير قادر على التعامل مع تغييرات التوجيه على الإطلاق.

استخدم هذا..

    android:screenOrientation="portrait"

في طريقة OnCreate لنشاطك، استخدم هذا الرمز:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

الآن سيتم تعيين اتجاهك إلى صورة ولن يتغير أبدا.

في ملف Androidmanifest.xml، لكل نشاط تريد قفله أضف الأخير screenOrientation خط:

android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >

أو Android: screenorientation = "المناظر الطبيعية".

في الخاص بك androidmanifest.xml. ملف:

   <activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">

أو

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

لقفل الشاشة عن طريق الرمز، عليك استخدام الدوران الفعلي للشاشة (0، 90، 180، 270) وعليك معرفة الموقف الطبيعي منه، في الهاتف الذكي سيكون الوضع الطبيعي صورة في جهاز لوحي، سيكون مناظر طبيعية.

إليك رمز (طرق قفل وفتح)، تم اختباره في بعض الأجهزة (الهواتف الذكية والأجهزة اللوحية) ويعمل بشكل رائع.

public static void lockScreenOrientation(Activity activity)
{   
    WindowManager windowManager =  (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);   
    Configuration configuration = activity.getResources().getConfiguration();   
    int rotation = windowManager.getDefaultDisplay().getRotation(); 

    // Search for the natural position of the device    
    if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&  
       (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) ||  
       configuration.orientation == Configuration.ORIENTATION_PORTRAIT &&   
       (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270))   
    {   
        // Natural position is Landscape    
        switch (rotation)   
        {   
            case Surface.ROTATION_0:    
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);    
                break;      
            case Surface.ROTATION_90:   
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
            break;      
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
                break;
        }
    }
    else
    {
        // Natural position is Portrait
        switch (rotation) 
        {
            case Surface.ROTATION_0: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
            break;   
            case Surface.ROTATION_90: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
            break;   
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;
        }
    }
}

public static void unlockScreenOrientation(Activity activity)
{
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}

في Visual Studio Xamarin:

  1. يضيف:

using Android.Content.PM; لك قائمة أسماء الاسم النشاط.

  1. يضيف:

[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]

كنسب لك الفصل، مثل هذا:

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}

يضيف

android:configChanges="keyboardHidden|orientation|screenSize" 

إلى بيان الخاص بك.

يرجى ملاحظة، لا يبدو أن أي من الأساليب تعمل الآن!

في بيئة تطوير أندرويد 1 طريقة واحدة بسيطة هي إضافةandroid:screenOrientation="nosensor".

هذا أقفال بفعالية توجيه الشاشة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top