سؤال

أقوم بإنشاء تطبيق على نمط المعالج، حيث أحتاج إلى الاحتفاظ ببيانات المستخدم بين الأنشطة A وB على قيد الحياة.يحتوي A على الزر الناعم التالي، بينما يحتوي B على زر ناعم للخلف.

عند الاستخدام FLAG_ACTIVITY_REORDER_TO_FRONT يمكنني الاحتفاظ ببيانات المستخدم حية عند استخدام الأزرار الإلكترونية، لأنه يتم إعادة استخدام كل نشاط.

ولكن، عندما يضغط المستخدم على زر الرجوع الثابت من B، يموت B، نظرًا لأن هذا الزر الثابت يستخدم Finish() ضمنيًا.

ثم حاولت التجاوز onBackPressed في B، مع إضافة نفس سلوك زر Back soft الخاص بي، معتقدًا أن زر Back الثابت سيتصرف تمامًا مثل الزر السابق (وليس إنهاء B).

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

المشكلة هي أن السلوك المتوقع لا يحدث، نظرًا لأن B لا يزال على قيد الحياة؛بحيث يتم تجاوزها onBackPressed في B لا يزال يستمع، وتحدث بعض السلوكيات الأخرى بدلاً من ذلك.

كيف يمكنني إنهاء الاستماع مع التجاوز onBackPressed في B، بحيث عندما يكون التركيز في A يترك التطبيق؟

شكرا لك مقدما.

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

المحلول 2

حسنًا، يمكنني حل مشكلتي بحل طبيعي لنظام Android:

بعد نصيحة Krylez، توقفت عن استخدام FLAG_ACTIVITY_REORDER_TO_FRONT، لذلك لم يعد لدي أي تعارض مع الزر الثابت، والآن أقوم بإعادة تدوير النية التي تبدأ المعالج.

في A، لدي طريقة شائعة جدًا يتم استدعاؤها عندما يضغط المستخدم على زر المتابعة للانتقال إلى B.يعد النشاط "أ" مجرد معلومات، لذا لا يحتاج إلى وضع إضافات Intent مع بيانات المستخدم عند الانتقال إلى النشاط "ب"، مثل هذا:

    /** Called when the user presses the Continue button*/
public void continueButtonOnClick(View view) {

        Intent intent = this.getIntent();
        intent.setClass(this, StepOneRegisterWizardActivity.class);
        startActivity(intent);
}

عندما يبدأ النشاط ب، يجب دائمًا البحث عما إذا كانت هناك بيانات مستخدم متاحة في إضافات Intent، مثل هذا:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_step_one_register_wizard);

    // Get the components of the content layout
    usernameEditText = (EditText)findViewById(R.id.usernameEditText);
    passwordEditText = (EditText)findViewById(R.id.passwordEditText);

    getIntentExtras();
}

private void getIntentExtras() {
    Intent intent = this.getIntent();

    Bundle bundle = intent.getExtras();
    if (bundle != null) {
        usernameEditText.setText(bundle.getCharSequence("usernameEditText"));
        passwordEditText.setText(bundle.getCharSequence("passwordEditText"));
    }
}

الآن، ربما من B، يضغط المستخدم على أي زر رجوع متاح (ناعم أو صلب) للعودة إلى A.في هذه الحالة، نحتاج إلى وضع بيانات المستخدم في إضافات Intent، مثل هذا:

    /** Called when the user presses the Back soft button*/
public void backButtonOnClick(View view) {
    onBackPressed();
}

@Override
/** Called when the user presses the Back hard button*/
public void onBackPressed() {
    finish();

    Intent intent = this.getIntent();
    intent.setClass(this, StepZeroRegisterWizardActivity.class);
    intent.putExtra("usernameEditText", usernameEditText.getText());
    intent.putExtra("passwordEditText", passwordEditText.getText());
    startActivity(intent);
}

أخيرًا، عندما يضغط المستخدم على زر المتابعة مرة أخرى، سيحتوي النشاط B الجديد على البيانات التي أدخلها المستخدم آخر مرة.

وآمل أن يساعد شخص ما.

نصائح أخرى

فكر في القيام بتعليق كريليز.أو قد ترغب في استخدامها فتات.إذا كنت تستهدف حزم SDK الأقدم من 3.x، فراجع مكتبة الدعم.

توجد نماذج لمشاريع داخل مجلد SDK، والتي تستخدم نمط المعالج.

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