سؤال

في بلدي الروبوت التطبيق, عندما تدوير الجهاز (الشريحة من لوحة المفاتيح) ثم Activity تشغيل (onCreate ويسمى).الآن, وربما هذا هو ما يجب أن يكون ، ولكن أفعل الكثير من الإعداد الأولية في onCreate طريقة لذلك أنا بحاجة إما:

  1. وضع كل الإعداد الأولي في وظيفة أخرى لذلك ليس كل ما خسر على جهاز الدوران أو
  2. تجعل من ذلك onCreate لا يسمى مرة أخرى و تخطيط يعدل فقط أو
  3. الحد من التطبيق إلى مجرد صورة بحيث onCreate لا يسمى.
هل كانت مفيدة؟

المحلول

باستخدام تطبيق الدرجة

اعتمادا على ما تفعله في التهيئة يمكن النظر في إنشاء فئة جديدة تمتد Application والتحرك الخاص بك رمز التهيئة إلى تجاوز onCreate طريقة ضمن تلك الفئة.

public class MyApplicationClass extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    // TODO Put your application initialization code here.
  }
}

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

انها ممارسة جيدة لفضح مثيل من هذه الفئة مثل المفرد وفضح تطبيق المتغيرات أنت تهيئة باستخدام حاصل على واضعي.

ملاحظة:سوف تحتاج إلى تحديد اسم التطبيق الجديد الخاص بك فئة في البيان أن تسجيل المستخدمة:

<application
    android:name="com.you.yourapp.MyApplicationClass"

الرد على تغييرات التكوين [تحديث:هذا هو مستنكر منذ API 13; ترى الموصى بها البديلة]

كما بديل آخر, هل يمكن أن يكون التطبيق الخاص بك الاستماع الأحداث التي من شأنها أن تتسبب في إعادة تشغيل مثل التوجه لوحة المفاتيح الرؤية التغيرات والتعامل معها ضمن النشاط الخاص بك.

تبدأ بإضافة android:configChanges عقدة إلى النشاط يعبر عن عقدة

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

أو أندرويد 3.2 (API level 13) وأحدث:

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

ثم ضمن النشاط تجاوز onConfigurationChanged طريقة الاتصال setContentView لإجبار المستخدم الرسومية تخطيط إلى إعادة القيام به في التوجه الجديد.

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setContentView(R.layout.myLayout);
}

نصائح أخرى

تحديث أندرويد 3.2 وأعلى:

الحذر:بداية مع أندرويد 3.2 (API level 13), إن "حجم الشاشة" أيضا التغييرات عندما يقوم الجهاز بالتبديل بين صورة ووضع أفقي.وهكذا, إذا كنت ترغب في منع التشغيل إعادة تشغيل بسبب تغيير التوجه عندما النامية على مستوى API 13 أو أعلى (كما أعلن minSdkVersion و targetSdkVersion سمات) ، يجب أن تشمل "screenSize" قيمة بالإضافة إلى "orientation" القيمة.فيجب أن تعلن android:configChanges="orientation|screenSize".ومع ذلك ، إذا كان التطبيق الخاص بك يستهدف مستوى API 12 أو أقل ، ثم النشاط الخاص بك دائما يتعامل مع هذا التكوين تغيير نفسه (تكوين هذا التغيير لا إعادة تشغيل النشاط الخاص بك حتى عند تشغيل الروبوت 3.2 أو أعلى الجهاز).

بدلا من محاولة وقف onCreate() من أن تطلق تماما ، ربما محاولة التحقق Bundle savedInstanceState يتم تمريرها إلى الحدث لمعرفة ما إذا كانت فارغة أم لا.

على سبيل المثال, إذا كان لدي بعض المنطق الذي يجب تشغيله عند Activity هو حقا خلق لا على كل تغيير التوجه ، أنا فقط تشغيل هذا المنطق في onCreate() إلا إذا كان savedInstanceState هي null.

وإلا كنت لا تزال تريد تخطيط رسم بشكل صحيح من أجل التوجه.

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_game_list);

        if(savedInstanceState == null){
            setupCloudMessaging();
        }
}

لست متأكدا إذا كان هذا هو الجواب النهائي ، لكنه يعمل بالنسبة لي.

ما فعلته...

في بيان الحمولة ، نشاط القسم, وأضاف:

android:configChanges="keyboardHidden|orientation"

في رمز النشاط ، تنفيذ:

//used in onCreate() and onConfigurationChanged() to set up the UI elements
public void InitializeUI()
{
    //get views from ID's
    this.textViewHeaderMainMessage = (TextView) this.findViewById(R.id.TextViewHeaderMainMessage);

    //etc... hook up click listeners, whatever you need from the Views
}

//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    InitializeUI();
}

//this is called when the screen rotates.
// (onCreate is no longer called when screen rotates due to manifest, see: android:configChanges)
@Override
public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);

    InitializeUI();
}

ما تصفون هو السلوك الافتراضي.لديك للكشف عن التعامل مع هذه الأحداث نفسك بإضافة:

android:configChanges

أن البيان ثم التغييرات التي تريد التعامل معها.لذلك التوجه ، يمكنك استخدام:

android:configChanges="orientation"

و لوحة المفاتيح يتم فتح أو إغلاق يمكنك استخدام:

android:configChanges="keyboardHidden"

إذا كنت ترغب في التعامل مع كل من يمكنك فقط تفصل بينهما مع الأنابيب الأوامر مثل:

android:configChanges="keyboardHidden|orientation"

وهذا سوف يؤدي إلى onConfigurationChanged الأسلوب في أي نشاط الاتصال.إذا تجاوز الطريقة التي يمكن أن تمر في القيم الجديدة.

ويساعد هذا الأمل.

لقد اكتشفت للتو هذا العلم:

من أجل الحفاظ على النشاط على قيد الحياة من خلال تغيير اتجاه و التعامل معها من خلال onConfigurationChanged, الوثائق و نموذج التعليمات البرمجية أعلاه أقترح هذا في ملف البيان:

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

الذي له فائدة إضافية أن يعمل دائما.

مكافأة العلم أن حذف keyboardHidden قد يبدو من المنطقي ، ولكنه يسبب الفشل في المحاكي (على الروبوت 2.1 على الأقل):تحديد فقط orientation سوف تجعل المحاكي الدعوة OnCreate و onConfigurationChanged أحيانا ، OnCreate أوقات أخرى.

أنا لم أر فشل في الجهاز لكن سمعت عن المحاكي الفشل على الآخرين.لذلك يستحق التوثيق.

كنت قد تنظر أيضا في استخدام منصة أندرويد طريقة استمرار البيانات عبر التوجه التغييرات: onRetainNonConfigurationInstance() و getLastNonConfigurationInstance().

هذا يسمح لك أن تستمر البيانات عبر تغييرات التكوين ، مثل المعلومات قد حصلت لك من خادم جلب أو أي شيء آخر التي تم حسابها في onCreate أو منذ ذلك الحين ، في حين يسمح أيضا الروبوت إلى إعادة تخطيط الخاص بك Activity باستخدام ملف xml من أجل التوجه الآن في الاستخدام.

انظر هنا أو هنا.

وتجدر الإشارة إلى أن هذه الأساليب وإهمال الآن (على الرغم من لا يزال أكثر مرونة من التعامل مع تغيير التوجه نفسك أكثر من الحلول المذكورة أعلاه تشير إلى) مع التوصية بأن الجميع التبديل إلى Fragments وبدلا من استخدام setRetainInstance(true) على كل Fragment كنت ترغب في الاحتفاظ بها.

هذا النهج هو مفيد ولكن غير مكتملة عند استخدام شظايا.

شظايا عادة الحصول على صوغه على تغيير التكوين.إذا كنت لا أتمنى أن يحدث هذا, استخدام

setRetainInstance(true); في جزء منشئ(s)

وهذا سوف يسبب شظايا الإبقاء خلال تغيير التكوين.

http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(منطقية)

أنا فقط ببساطة إضافة

     android:configChanges="keyboard|keyboardHidden|orientation"

في ملف البيان ، لا تضيف أي onConfigurationChanged طريقة في النشاط.

لذلك في كل مرة لوحة مفاتيح تنزلق أو في أي شيء يحدث.

على onCreate الأسلوب لا يزال يسمى حتى عند تغيير orientation الروبوت.حتى تتحرك جميع ثقيلة وظائف هذا الأسلوب لن تساعدك

وهو بسيط جدا فقط قم بالخطوات التالية:

<activity
    android:name=".Test"
    android:configChanges="orientation|screenSize"
    android:screenOrientation="landscape" >
</activity>

يعمل هذا بالنسبة لي :

ملاحظة: التوجه يعتمد على requitement

ضع الكود التالي داخل <activity> الوسم في Manifest.xml:

android:configChanges="screenLayout|screenSize|orientation"
 onConfigurationChanged is called when the screen rotates. 
 (onCreate is no longer called when screen rotates due to manifest, see:  
 android:configChanges)

أي جزء من البيان يقول "لا تتصل onCreate()"?

أيضا ، Google docs أقول تجنب استخدام android:configChanges (إلا كملاذ أخير)....ولكن بعد ذلك أساليب بديلة فإنها تشير إلى كل هل استخدام android:configChanges.

لقد كانت تجربتي أن المحاكي دائما المكالمات onCreate() على التناوب.
ولكن 1-2 أجهزة تشغيل نفس القانون على...لا.(لست متأكدا لماذا لن يكون هناك أي فرق.)

إضافة هذا السطر إلى البيان :-

android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode"

هذا مقتطف النشاط :-

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

تغييرات في بيان Android هي:

android:configChanges="keyboardHidden|orientation" 

اضافات تكون داخل النشاط هي:

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

هناك عدة طرق للقيام بذلك:

حفظ نشاط الدولة

يمكنك حفظ نشاط الدولة في onSaveInstanceState.

@Override
public void onSaveInstanceState(Bundle outState) {
    /*Save your data to be restored here
    Example : outState.putLong("time_state", time); , time is a long variable*/
    super.onSaveInstanceState(outState);
}

ومن ثم استخدام bundle إلى استعادة الدولة.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState!= null){
       /*When rotation occurs
        Example : time = savedInstanceState.getLong("time_state", 0); */
    } else {
      //When onCreate is called for the first time
    }
}

التعامل مع التوجه التغييرات بنفسك

وثمة بديل آخر هو التعامل مع تغييرات التوجه من قبل نفسك.ولكن هذا لا يعتبر ممارسة جيدة.

هذا إضافة إلى ملف manifest.

android:configChanges="keyboardHidden|orientation"

الروبوت 3.2 و في وقت لاحق:

android:configChanges="keyboardHidden|orientation|screenSize"

@Override
public void onConfigurationChanged(Configuration config) {
    super.onConfigurationChanged(config);

if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //Handle rotation from landscape to portarit mode here
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
        //Handle rotation from portrait to landscape mode here
    }
}

تقييد دوران

يمكنك أيضا حصر النشاط الخاص بك إلى وضع عمودي أو أفقي لتجنب الدوران.

هذا إضافة إلى النشاط الوسم في ملف manifest:

        android:screenOrientation="portrait"

أو تنفيذ هذا برمجيا في النشاط الخاص بك:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

الطريق وجدت للقيام بذلك هو استخدام onRestoreInstanceState و onSaveInstanceState الأحداث إلى حفظ شيء في Bundle (حتى إذا كنت لا تحتاج إلى أي متغيرات حفظها فقط وضع شيء في هناك حتى Bundle ليست فارغة).ثم في onCreate طريقة, تحقق لمعرفة ما إذا كان Bundle فارغة ، وإذا كان كذلك ، ثم القيام التهيئة, إن لم يكن, ثم القيام بذلك.

على الرغم من أنها ليست "أندرويد طريقة" لقد حصلت على نتائج جيدة جدا من خلال التعامل مع تغيير اتجاه نفسي ببساطة إعادة الحاجيات داخل أجل اتخاذ غيرت التوجه بعين الاعتبار.هذا هو أسرع من أي نهج آخر ، لأن وجهات النظر لا يجب أن يكون حفظ و استعادة.كما يوفر تجربة أكثر سلاسة بالنسبة للمستخدم, لأن respositioned الحاجيات هي بالضبط نفس الحاجيات فقط نقلها و/أو تغيير حجمها.ليس فقط نموذج الدولة ، ولكن أيضا عرض الدولة يمكن أن تكون محفوظة في هذه الطريقة.

RelativeLayout في بعض الأحيان يمكن أن يكون خيارا جيدا وجهة النظر التي قد إعادة توجيه نفسها من وقت لآخر.يمكنك فقط تقديم مجموعة من تخطيط صورة params ومجموعة من المناظر الطبيعية تخطيط params مع مختلف المواقع النسبية القواعد على كل, لكل طفل القطعة.ثم في onConfigurationChanged() طريقة تمرير مناسبة واحدة إلى setLayoutParams() ندعو كل طفل.إذا كان أي الطفل السيطرة على ذاته يحتاج إلى داخليا توجيه ، يمكنك فقط استدعاء أسلوب على أن الطفل لأداء إعادة توجيه.هذا الطفل أيضا إلى الطرق على أي من لها الطفل الضوابط التي ينبغي الداخلية إعادة توجيه ، وهلم جرا.

في كل مرة عندما استدارة الشاشة ، فتح الانتهاء من النشاط و onCreate الخاص() يسمى مرة أخرى.

1 .يمكنك أن تفعل الشيء الوحيد لإنقاذ الدولة من النشاط عند تدوير الشاشة بحيث يمكنك استعادة جميع الاشياء القديمة عندما النشاط onCreate الخاص() يسمى مرة أخرى.الرجوع هذا الرابط

2 .إذا كنت ترغب في منع إعادة تشغيل النشاط فقط ضع ما يلي في manifest.xml الملف.

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

ملاحظة: وأنا بعد هذا الجواب إذا كان شخص ما في المستقبل تواجه نفس المشكلة لي.بالنسبة لي السطر التالي لم يكن enought:

android:configChanges="orientation"

عندما استدارة الشاشة, طريقة `onConfigurationChanged(التكوين newConfig) هل يمكنني الحصول على استدعاء.

الحل: وأود أيضا أن أضيف "حجم الشاشة" حتى إذا كانت المشكلة لها علاقة التوجه.حتى في AndroidManifest.xml - الملف بإضافة هذا:

android:configChanges="keyboardHidden|orientation|screenSize"

ثم تنفيذ الطريقة onConfigurationChanged(Configuration newConfig)

تحتاج إلى استخدام onSavedInstanceState طريقة لتخزين كل قيمة المعلمة لديها هذا هو حزمة

@Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        outPersistentState.putBoolean("key",value);
    }

واستخدام

@Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        savedInstanceState.getBoolean("key");
    } 

إلى retrive وتعيين القيمة إلى عرض الكائنات وسوف يتعامل مع تناوب الشاشة

في نشاط القسم manifest, إضافة:

android:configChanges="keyboardHidden|orientation"

إضافة هذا السطر في البيان : android:configChanges="orientation|screenSize"

الناس يقولون أنه يجب استخدام

android:configChanges="keyboardHidden|orientation"

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

بالطبع ، هناك طريقة أخرى, هل يمكن تخزين القيم أو الآراء مع onSaveInstanceState وقراءتها مع onRestoreInstanceState.والامر متروك لكم حقا.

بعد فترة من التجربة والخطأ ، وجدت الحل الذي يناسب احتياجات بلدي في معظم الحالات.هنا هو رمز:

يعبر عن التكوين:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.pepperonas.myapplication">

    <application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity:

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";

    private Fragment mFragment;

    private int mSelected = -1;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate  " + "");

        // null check not realy needed - but just in case...
        if (savedInstanceState == null) {

            initUi();

            // get an instance of FragmentTransaction from your Activity
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            /*IMPORTANT: Do the INITIAL(!) transaction only once!
            * If we call this everytime the layout changes orientation,
            * we will end with a messy, half-working UI.
            * */
            mFragment = FragmentOne.newInstance(mSelected = 0);
            fragmentTransaction.add(R.id.frame, mFragment);
            fragmentTransaction.commit();
        }
    }


    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onConfigurationChanged  " +
                   (newConfig.orientation
                    == Configuration.ORIENTATION_LANDSCAPE
                    ? "landscape" : "portrait"));

        initUi();

        Log.i(TAG, "onConfigurationChanged - last selected: " + mSelected);
        makeFragmentTransaction(mSelected);
    }


    /**
     * Called from {@link #onCreate} and {@link #onConfigurationChanged}
     */
    private void initUi() {
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate  instanceState == null / reinitializing..." + "");
        Button btnFragmentOne = (Button) findViewById(R.id.btn_fragment_one);
        Button btnFragmentTwo = (Button) findViewById(R.id.btn_fragment_two);
        btnFragmentOne.setOnClickListener(this);
        btnFragmentTwo.setOnClickListener(this);
    }


    /**
     * Not invoked (just for testing)...
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "onSaveInstanceState  " + "YOU WON'T SEE ME!!!");
    }


    /**
     * Not invoked (just for testing)...
     */
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "onSaveInstanceState  " + "YOU WON'T SEE ME, AS WELL!!!");
    }


    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume  " + "");
    }


    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause  " + "");
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy  " + "");
    }


    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.btn_fragment_one:
                Log.d(TAG, "onClick btn_fragment_one " + "");
                makeFragmentTransaction(0);
                break;

            case R.id.btn_fragment_two:
                Log.d(TAG, "onClick btn_fragment_two " + "");
                makeFragmentTransaction(1);
                break;

            default:
                Log.d(TAG, "onClick  null - wtf?!" + "");
        }
    }


    /**
     * We replace the current Fragment with the selected one.
     * Note: It's called from {@link #onConfigurationChanged} as well.
     */
    private void makeFragmentTransaction(int selection) {

        switch (selection) {
            case 0:
                mFragment = FragmentOne.newInstance(mSelected = 0);
                break;
            case 1:
                mFragment = FragmentTwo.newInstance(mSelected = 1);
                break;
        }

        // Create new transaction
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack
        transaction.replace(R.id.frame, mFragment);

        /*This would add the Fragment to the backstack...
        * But right now we comment it out.*/
        //        transaction.addToBackStack(null);

        // Commit the transaction
        transaction.commit();
    }

}

و عينة جزء:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * @author Martin Pfeffer (pepperonas)
 */
public class FragmentOne extends Fragment {

    private static final String TAG = "FragmentOne";


    public static Fragment newInstance(int i) {
        Fragment fragment = new FragmentOne();
        Bundle args = new Bundle();
        args.putInt("the_id", i);
        fragment.setArguments(args);
        return fragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView  " + "");
        return inflater.inflate(R.layout.fragment_one, container, false);
    }

}

ويمكن الاطلاع على جيثب.

استخدام orientation المستمع لأداء مهام مختلفة على مختلف ميولهم.

@Override
public void onConfigurationChanged(Configuration myConfig) 
{
    super.onConfigurationChanged(myConfig);
    int orient = getResources().getConfiguration().orientation; 
    switch(orient) 
    {
       case Configuration.ORIENTATION_LANDSCAPE:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                    break;
       case Configuration.ORIENTATION_PORTRAIT:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                    break;
       default:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    }
}

وضع هذا رمز أدناه في Activity في Android Manifest.

android:configChanges="orientation"

هذا لن يؤدي إلى إعادة تشغيل النشاط الخاص بك عند تغيير التوجه.

إصلاح اتجاه الشاشة (أفقي أو عمودي) في AndroidManifest.xml

android:screenOrientation="portrait" أو android:screenOrientation="landscape"

من أجل هذا onResume() الطريقة لا يسمى.

واحدة من أفضل مكون من الروبوت architechure أعرض من قبل جوجل سوف تفي بجميع المتطلبات التي ViewModel.

المصممة لتخزين و إدارة واجهة المستخدم البيانات ذات الصلة في دورة حياة زائد من شأنها أن تسمح بيانات البقاء على قيد الحياة تدوير الشاشة

class MyViewModel : ViewModel() {

يرجى الرجوع إلى هذا:https://developer.android.com/topic/libraries/architecture/viewmodel

يمكنك قفل التوجه الحالي الشاشة باستخدام هذا الرمز...

int currentOrientation =context.getResources().getConfiguration().orientation;
        if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) {
            ((Activity) context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } else {
            ((Activity) context). setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top