Android: evitando el conflicto de la configuración de los valores de campo de texto en OnResume vs. OnactivityResult

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

  •  25-09-2019
  •  | 
  •  

Pregunta

Estoy escribiendo una aplicación Android que permite a un usuario mantener una lista de productos. En la actividad EnterProductData, el usuario puede ingresar información sobre el producto en Forming Fields, que luego guardará la información en un DB SQLite. La actividad EnterProductData también permite al usuario iniciar un escaneo de código de barras a través de la aplicación del escáner de código de barras para capturar el código UPC.

El problema que me enfrento es intentar establecer el valor del campo de texto UPC en OnActivityResult () una vez que la actividad de escaneo de código de barras se completa y devuelve el valor. Lo que está terminando sucediendo es que mi método Onresume () está llamando a una función (PopulateFields ()) que establece los valores de los campos de texto en lo que se guarda actualmente en el DB. Y esto parece estar pasando después OnActivityResult () se llama. Esto significa que el UPC escaneado se establece como el valor del campo de texto, solo para que un valor vacío se configure inmediatamente después. La línea de código a la culpa se comenta con asteriscos al lado.

Me imagino que si guardo inmediatamente el UPC escaneado al DB en el método OnActivityResult (), puedo evitar este problema, pero esa no parece ser la mejor práctica, en mi opinión. ¿Alguien puede aconsejarme sobre lo que debería hacer?

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

Solución

Puede leer los valores de la base de datos al inicio, es decir, en OnCreate y almacenar en variables de miembros. Actualice estos valores cuando sea necesario. Guarde los valores a la base de datos mientras sale de la aplicación. Esto no solo soluciona su problema, sino que también evita muchas interacciones de bases de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top