Android - تجنب تعارض تعيين قيم حقل النص في onResume مقابل onActivityResult

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

  •  25-09-2019
  •  | 
  •  

سؤال

أنا أكتب تطبيق Android يتيح للمستخدم الحفاظ على قائمة المنتجات. في نشاط EnterProductData ، يمكن للمستخدم إدخال معلومات حول المنتج في حقول النماذج ، والتي ستؤدي بعد ذلك إلى حفظ المعلومات إلى SQLite DB. يسمح نشاط EnterProductData للمستخدم أيضًا ببدء فحص الباركود عبر تطبيق الماسح الضوئي للباركود من أجل التقاط رمز UPC.

المشكلة التي أواجهها تحاول تعيين قيمة حقل نص UPC في onActivityResult () بمجرد اكتمال نشاط مسح الباركود وإرجاع القيمة. ما ينتهي به الأمر هو أن طريقة onresume () هي استدعاء وظيفة (populatefields ()) التي تحدد قيم حقول النص على كل ما يتم حفظه حاليًا في DB. ويبدو أن هذا يحدث بعد، بعدما onActivityResult () يسمى. هذا يعني أنه يتم تعيين UPC الممسوحة ضوئيًا كقيمة حقل النص ، فقط لضبط قيمة فارغة عليها مباشرة. يتم التعليق على سطر التعليمات البرمجية اللوم مع العلامات النجمية بجانبها.

أتصور أنه إذا قمت على الفور بحفظ UPC الممسوحة ضوئيًا إلى DB في طريقة OnActivityResult () ، يمكنني تجنب هذه المشكلة ، لكن هذا لا يبدو أنه أفضل الممارسات ، في رأيي. هل يمكن لأحد أن ينصحني بما يجب أن أفعله؟

EnterProductData.java

public class EnterProductData extends Activity {

    private Button mScanButton;
    private EditText mUPC;
    private Button mSaveButton;
    private Long mRowId;
    private DbAdapter mDbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mDbHelper = new DbAdapter(this);
        mDbHelper.open();

        setContentView(R.layout.enter_product_data);

        mUPC = (EditText) findViewById(R.id.UPC);
        mScanButton = (Button) findViewById(R.id.scanButton);
        mSaveButton = (Button) findViewById(R.id.saveButton);

        mRowId = (savedInstanceState == null) ? null :
        (Long) savedInstanceState.getSerializable(DbAdapter.KEY_PRODUCT_ROWID);
        if (mRowId == null) {
            Bundle extras = getIntent().getExtras();
            mRowId = extras != null ? extras.getLong(DbAdapter.KEY_PRODUCT_ROWID): null;
        }

        populateFields();

        mScanButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                IntentIntegrator.initiateScan(EnterProductData.this);
            }
        });

        mSaveButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                setResult(RESULT_OK);
                finish();
            }
        });

    }

    private void populateFields() {
        if (mRowId != null) {
            Cursor product = mDbHelper.fetchProduct(mRowId);
            startManagingCursor(product);
            mUPC.setText(product.getString(
                product.getColumnIndexOrThrow(DbAdapter.KEY_UPC))); //******
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        saveState();
        outState.putSerializable(DbAdapter.KEY_PRODUCT_ROWID, mRowId);
    }

    @Override
    protected void onPause() {
        super.onPause();
        saveState();
    }

    @Override
    protected void onResume() {
        super.onResume();
        populateFields();
    }

    private void saveState() {
     String upc= mUPC.getText().toString();
        if (mRowId == null) {
            long id = mDbHelper.createProduct(mRowId, UPC);
            if (id > 0) {
                mRowId = id;
            }
        } else {
            mDbHelper.updateProduct(mRowId, UPC);
        }
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  switch(requestCode) {
   case IntentIntegrator.REQUEST_CODE: {
    if (resultCode != RESULT_CANCELED) {
     IntentResult scanResult =
     IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
     if (scanResult != null) {
      String upc = scanResult.getContents();
      mUPC.setText(upc);
     }
    }
    break;
   }
  }
 }
}
هل كانت مفيدة؟

المحلول

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

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