Android - evitar o conflito de definição do campo de texto de valores em onResume vs.onActivityResult

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

  •  25-09-2019
  •  | 
  •  

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;
   }
  }
 }
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top