Android - Vermeiden Sie Konflikte zur Festlegung von Textfeldwerten in OnResume vs. OnactivityResult

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

  •  25-09-2019
  •  | 
  •  

Frage

Ich schreibe eine Android -Anwendung, mit der ein Benutzer eine Liste von Produkten verwaltet. In der EnterproductData -Aktivität kann der Benutzer Informationen über das Produkt in Formularfelder eingeben, wodurch die Informationen in einer SQLite -DB gespeichert werden. Mit der EnterproductData -Aktivität kann der Benutzer außerdem eine Barcode -Scan über die Barcode -Scanner -App initiieren, um den UPC -Code zu erfassen.

Das Problem, mit dem ich konfrontiert bin, ist, den Wert des UPC -Textfelds in OnactivityResult () festzulegen, sobald die Barcode -Scan -Aktivität abgeschlossen ist und den Wert zurückgibt. Was am Ende passiert, ist meine OnResume () -Methode, die eine Funktion (populatefields ()) aufruft, die die Werte der Textfelder auf das festlegt, was derzeit in der DB gespeichert ist. Und das scheint passiert nach OnactivityResult () wird aufgerufen. Dies bedeutet, dass der gescannte UPC als Textfeldwert festgelegt wird, nur damit ein leerer Wert unmittelbar danach darauf eingestellt ist. Die Schuldlinie wird mit Sternchen daneben kommentiert.

Ich stelle mir vor, dass ich dieses Problem vermeiden kann, wenn ich den gescannten UPC sofort auf die DB speichere, aber meiner Meinung nach scheint das nicht die beste Praxis zu sein. Kann mir jemand darüber beraten, was ich tun sollte?

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;
   }
  }
 }
}
War es hilfreich?

Lösung

Sie können die Werte aus der Datenbank bei Start-up IE in OnCreate und in Mitgliedsvariablen lesen. Aktualisieren Sie diese Werte bei Bedarf. Speichern Sie die Werte zurück in die Datenbank, während Sie die Anwendung verlassen. Dies behebt nicht nur Ihr Problem, sondern verhindert auch viele Datenbankinteraktionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top