Android - избегание конфликта установки значений текстовых полей в OnResume против оноктивностиResult
Вопрос
Я пишу приложение для Android, которое позволяет пользователю поддерживать список продуктов. В активности EnterproductData пользователь может ввести информацию о продукте в полях формы, которые затем сохранят информацию к SQLite DB. Работа EnterproductData также позволяет пользователю инициировать сканирование штрих-кода через приложение сканера штрих-кода, чтобы захватить код UPC.
Проблема, которую я сталкиваюсь, пытается установить значение текстового поля UPC в OnactivityResult () после завершения активности сканирования штрих-кода и возвращает значение. То, что происходит заканчивается мой метод OnResume (), вызывает функцию (popatulatefields ()), которые устанавливают значения текстовых полей к тому, что в данный момент сохраняется в БД. И это, кажется, происходит после 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 и храните в переменных пользователя. Обновите эти значения при необходимости. Храните значения обратно в базу данных при выходе на приложение. Это не только исправляет вашу проблему, но также предотвращает множество взаимодействий баз данных.