Android - Evitare il conflitto di impostazione dei valori dei campi di testo in onResume vs. OnactivityResult
Domanda
Sto scrivendo un'applicazione Android che consente a un utente di mantenere un elenco di prodotti. Nell'attività EnterProductData, l'utente può inserire informazioni sul prodotto in campi da modulo, che salverà le informazioni su un DB SQLite. L'attività EnterProductData consente inoltre all'utente di avviare una scansione a codice a barre tramite l'app Scanner a barre per acquisire il codice UPC.
Il problema che sto affrontando sta cercando di impostare il valore del campo di testo UPC in onActivityResult () una volta completata l'attività di scansione del codice a barre e restituisce il valore. Quello che sta finendo sta accadendo è il mio metodo onResume () è chiamare una funzione (populatefields ()) che imposta i valori dei campi di testo su tutto ciò che è attualmente salvato nel DB. E questo sembra accadere dopo è chiamato onActivityResult (). Ciò significa che l'UPC scansionato è impostato come valore del campo di testo, solo per impostare un valore vuoto immediatamente dopo. La riga di codice da incolpare è commentata con gli asterischi accanto.
Immagino che se salvo immediatamente l'UPC scansionati al DB nel metodo OnactivityResult (), posso evitare questo problema, ma questa non sembra essere la migliore pratica, secondo me. Qualcuno può consigliarmi su cosa dovrei fare?
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;
}
}
}
}
Soluzione
È possibile leggere i valori dal database all'avvio, IE, in OnCreate e archiviare nelle variabili dei membri. Aggiorna questi valori quando richiesto. Abbandona i valori al database durante la uscita dall'applicazione. Ciò non solo risolve il problema, ma impedisce anche molte interazioni del database.