التغيير بتوجيه التوجيه بشاشة برشاقة أثناء بداية النشاط

StackOverflow https://stackoverflow.com/questions/2434071

سؤال

أحاول إيجاد طريقة للتعامل بشكل صحيح في إعداد النشاط حيث يتم تحديد اتجاهه من البيانات في النية التي أطلقتها. هذا هو للعبة التي يمكن للمستخدم اختيار مستوياتها، بعضها اتجاه عمودي INT وبعضها اتجاه أفقي. المشكلة التي أواجهها هي ذلك setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) لا يسري حتى يتم تحميل النشاط بالكامل. هذه مشكلة بالنسبة لي لأنني أقوم ببعض عمليات التحميل والصورة أثناء بدء التشغيل، والتي أود القيام بها مرة واحدة فقط.

حاليا، إذا اختار المستخدم مستوى أفقي:

  • يبدأ النشاط OnCheate ()، الافتراضي إلى صورة
  • يكتشف من تحليل نية إطلاقه أنه يجب أن يكون في اتجاه أفقي
  • لا يزال بغض النظر عن OnResume ()، وتحميل المعلومات وأداء مهام الإعداد الأخرى
  • في هذه المرحلة، ينطلق SetRequestorientationation في ذلك، حتى يتم تشغيل التطبيق من خلال OnDestroy ()
  • ثم يبدأ مرة أخرى من OnCreate () ويعمل إلى OnResume () تكرار الإعداد من قبل

هل هناك طريقة لتجنب ذلك ولها لا تؤدي التحميل مرتين؟ على سبيل المثال، من الناحية المثالية، سيعلم النشاط قبل أن يسمى onCreate ما إذا كان ينبغي أن يكون مناظر طبيعية أو صورة اعتمادا على بعض الممتلكات لإطلاق نية، ولكن لم أفتقد شيئا غير ممكن. لقد تمكنت من الاختراق معا وسيلة لتجنب تكرار التحميل عن طريق التحقق من boolean قبل خطوات التحميل المستهلكة للوقت، ولكن هذا لا يبدو وكأنه الطريقة الصحيحة للقيام بذلك. أتصور أنني يمكن أن تتجاوز onSaveInstanceState, ، ولكن هذا سيتطلب الكثير من الترميز الإضافي. هل هناك طريقة بسيطة للقيام بذلك؟

شكرا!


المحلول:

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

public class GameLandscape extends GameLogic{
}

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

لذلك مشكلة بسيطة في الواقع.

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

المحلول

يمكنك إجراء نشاطين - واحد لمستويات عمودي، والآخر لمستويات المناظر الطبيعية - ثم قم بتعيين اتجاه النشاط في Androidmanifest.xml، باستخدام android:screenOrientation ينسب. لن تضطر حتى إلى تكرار رمز إذا كنت تستخدم الميراث؛ استخدم نشاطك الحالي كنشاط أساسي، وفقط إنشاء أنشطة المناظر الطبيعية / الصورة كدفاعي لهذه النشاط.

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

نصائح أخرى

يمكنك أيضا تجاوز onRetainNonConfigurationInstance(). وبعد يتيح لك ذلك تخزين عنصر واحد مؤقتا يمكنك استرداده عن طريق الاتصال getLastNonConfigurationInstance(). وبعد بهذه الطريقة يمكنك تحميل كل الأشياء التي تحتاج إليها وفي onRetainNonConfigurationInstance() الطريقة التي يمكنك حفظها كل شيء في بنية بيانات وإرجاعها. في الخاص بك onCreate() تستطيع الاتصال getLastNonConfigurationInstance() وإذا عودت "تحميل NULL"، قم بتحميل جميع الأشياء الخاصة بك، إذا أرجع شيئا ما، فأنت تم تحميل كل شيء. إليك مثال سريع:

public class MyActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        DataStructure myData = (DataStructure)getLastNonConfigurationInstance();
        if(myData == null)
        {
            // Load everything in
        }
        else
        {
            // Unpack myData
        }
    }

    @Override
    public Object onRetainNonConfigurationInstance()
    {
        DataStructure myData = new DataStructure();
        // Put everything in to myData
        return myData;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top