Android - Evitare il conflitto di impostazione dei valori dei campi di testo in onResume vs. OnactivityResult

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

  •  25-09-2019
  •  | 
  •  

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;
   }
  }
 }
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top