Android - evitar o conflito de definição do campo de texto de valores em onResume vs.onActivityResult
Pergunta
Eu estou escrevendo um aplicativo para Android que permite ao usuário manter uma lista de produtos.No EnterProductData atividade, o usuário pode inserir informações sobre o produto em campos de formulário, que será, em seguida, salvar as informações em um SQLite DB.O EnterProductData atividade também permite que o usuário iniciar uma verificação através de código de barras o código de Barras aplicativo de Scanner para capturar o código de barras UPC.
O problema que eu estou enfrentando é tentar definir o valor da UPC campo de texto no onActivityResult() quando o código de barras de actividade da análise é completa e retorna o valor.O que é acabar acontecendo é o meu onResume() o método é chamar uma função (populateFields()) que define os valores dos campos de texto que é salvo no momento em DB.E isso parece estar acontecendo depois de onActivityResult() é chamado.Isso significa que o digitalizados UPC é definido como o valor do campo de texto, apenas um valor vazio para ser definido imediatamente após.A linha de código a culpa é comentada com asteriscos ao lado.
Eu imagino que se eu imediatamente guardar a imagem digitalizada UPC para o DB no onActivityResult() método, e posso evitar esse problema, mas que não parece ser a melhor prática, na minha opinião.Alguém pode me aconselhar sobre o que eu deveria fazer?
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;
}
}
}
}
Solução
Você pode ler os valores do Banco de dados na inicialização, por exemplo, no onCreate e armazenar em variáveis de membro.Actualizar estes valores quando necessário.Armazenar os valores de volta para o banco de dados ao sair do aplicativo.Isto não só corrige o problema, mas também impede que muitas interações com banco de dados.