Android - éviter les conflits d'établir des valeurs de champ de texte dans onResume vs onActivityResult

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

  •  25-09-2019
  •  | 
  •  

Question

J'écris une application Android qui permet à un utilisateur de maintenir une liste de produits. Dans l'activité EnterProductData, l'utilisateur peut saisir des informations sur le produit dans les champs de formulaire, qui sera ensuite enregistrer les informations à un SQLite DB. L'activité EnterProductData permet également à l'utilisateur de lancer un scan de codes à barres via l'application Barcode Scanner afin de capturer le code UPC.

Le problème que je suis face essaie de définir la valeur du champ texte UPC dans onActivityResult () une fois l'activité de balayage de codes à barres est terminé et retourne la valeur. Ce qui se passe est de se retrouver ma méthode onResume () appelle une fonction (populateFields ()) qui définit les valeurs des champs de texte à tout ce qui est actuellement enregistré dans la base de données. Et cela semble se produire après onActivityResult () est appelée. Cela signifie que l'UPC numérisée est défini comme la valeur du champ de texte, seulement pour une valeur vide à la valeur immédiatement après. La ligne de code à blâmer est commenté avec astérisques à côté.

Je suppose que si je sauve immédiatement l'UPC scannée à la DB dans la méthode onActivityResult (), je peux éviter ce problème, mais cela ne semble pas être la meilleure pratique, à mon avis. Quelqu'un peut-il me conseiller sur ce que je dois faire?

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;
   }
  }
 }
}
Était-ce utile?

La solution

Vous pouvez lire les valeurs de base de données au démarrage à savoir, dans onCreate et stocker dans des variables membres. Mettre à jour ces valeurs lorsque cela est nécessaire. Conserver les valeurs à la base de données en sortie de l'application. Cela corrige non seulement votre problème, mais empêche également de nombreuses interactions de base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top