Java Android-避免在onResume和onActivityResult中设置文本字段值的冲突

Java Android-避免在onResume和onActivityResult中设置文本字段值的冲突,java,android,onresume,Java,Android,Onresume,我正在编写一个Android应用程序,允许用户维护产品列表。在EnterProductData活动中,用户可以在表单字段中输入有关产品的信息,然后表单字段将信息保存到SQLite数据库中。EnterProductData活动还允许用户通过条形码扫描仪应用程序启动条形码扫描,以捕获UPC代码 我面临的问题是,一旦条形码扫描活动完成并返回值,就试图在onActivityResult()中设置UPC文本字段的值。结果是,我的onResume()方法调用了一个函数(populateFields()),该

我正在编写一个Android应用程序,允许用户维护产品列表。在EnterProductData活动中,用户可以在表单字段中输入有关产品的信息,然后表单字段将信息保存到SQLite数据库中。EnterProductData活动还允许用户通过条形码扫描仪应用程序启动条形码扫描,以捕获UPC代码

我面临的问题是,一旦条形码扫描活动完成并返回值,就试图在onActivityResult()中设置UPC文本字段的值。结果是,我的onResume()方法调用了一个函数(populateFields()),该函数将文本字段的值设置为数据库中当前保存的值。这似乎是在调用onActivityResult()之后发生的。这意味着扫描的UPC被设置为文本字段值,仅在扫描后立即设置为空值。这一行代码旁边有星号注释

我想,如果我立即用onActivityResult()方法将扫描的UPC保存到DB中,我可以避免这个问题,但在我看来,这似乎不是最佳做法。有人能告诉我该怎么做吗

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;
   }
  }
 }
}

您可以在启动时从数据库中读取值,即在onCreate中读取值并存储在成员变量中。需要时更新这些值。退出应用程序时将值存储回数据库。这不仅解决了您的问题,还阻止了许多数据库交互。

好的,我修改了代码,使其执行以下操作:-在onCreate()中,数据从数据库读取,存储到成员变量,然后设置为表单字段-在saveState()中,表单字段的值保存回成员变量,然后成员变量作为参数传递到update/createProduct()方法中,并保存到数据库中。现在,无论何时调用onResume,我都将表单字段的值设置为成员变量。听起来对吗?