按下后退按钮时强制关闭

时间:2012-04-13 00:26:56

标签: java android barcode-scanner

当我进入此页面并单击后退按钮时,我会强制关闭,因为它强制关闭我的条形码扫描结果不显示。如何阻止app强制关闭?

private EditText mTitleText;
private EditText mBodyText;
private EditText mquantityint;
private EditText mbarcodeint;
private Long mRowId;
private NotesDbAdapter mDbHelper;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mDbHelper = new NotesDbAdapter(this);
    mDbHelper.open();

    setContentView(R.layout.note_edit);

    mTitleText = (EditText) findViewById(R.id.title);
    mBodyText = (EditText) findViewById(R.id.body);
    mquantityint = (EditText) findViewById(R.id.quantity);
    mbarcodeint = (EditText) findViewById(R.id.barcode);

    Button barcode2 = (Button) findViewById(R.id.sbarcode);
    barcode2.setOnClickListener(new OnClickListener() {
        public void onClick(View arg0)
        {
            Intent intent = new Intent("com.google.zxing.client.android.SCAN");
            intent.putExtra("SCAN_MODE", "PRODUCT_MODE");
            intent.putExtra("SAVE_HISTORY", false);//this stops saving ur barcode in barcode scanner app's history
            startActivityForResult(intent, 0);
        }
    });

    Button confirmButton = (Button) findViewById(R.id.confirm);

    mRowId = (savedInstanceState == null) ? null :
        (Long) savedInstanceState.getSerializable(NotesDbAdapter.KEY_ROWID);
    if (mRowId == null) {
        Bundle extras = getIntent().getExtras();
        mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID)
                                : null;
    }

    populateFields();

    confirmButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            setResult(RESULT_OK);
            finish();
        }
    });
}

private void populateFields() {
    if (mRowId != null) {
        Cursor note = mDbHelper.fetchNote(mRowId);
        startManagingCursor(note);
        mTitleText.setText(note.getString(
                note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
        mBodyText.setText(note.getString(
                note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
        mquantityint.setText(note.getString(
                note.getColumnIndexOrThrow(NotesDbAdapter.KEY_QUANTITY)));
        mbarcodeint.setText(note.getString(
                note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BARCODE)));
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    saveState();
    outState.putSerializable(NotesDbAdapter.KEY_ROWID, mRowId);
}

@Override
protected void onPause() {
    super.onPause();
    saveState();
}

@Override
protected void onResume() {
    super.onResume();
    populateFields();
}

private void saveState() {
    String title = mTitleText.getText().toString();
    String body = mBodyText.getText().toString();
    int quantity =Integer.parseInt( mquantityint.getText().toString());
    int barcode =Integer.parseInt( mbarcodeint.getText().toString());
    if (mRowId == null) {
        long id = mDbHelper.createNote(title, body, quantity, barcode);
        if (id > 0) {
            mRowId = id;
        }
    } else {
        mDbHelper.updateNote(mRowId, title, body, quantity, barcode);
    }
}

public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    String contents =null;
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 0)
    {
        if (resultCode == RESULT_OK)
        {
            contents = data.getStringExtra("SCAN_RESULT");
            // String format = data.getStringExtra("SCAN_RESULT_FORMAT");
            //Variable set for QR scan result
            EditText sbarcodeno = (EditText) findViewById(R.id.barcodeno);
            //Variable set to display custom string above result  
            EditText Result =(EditText) findViewById(R.id.sbarcode);
            //Displays actual  
            sbarcodeno.setText(contents);
            //Edit string here    
            Result.setText(""); 
            // TO DO - Modify code so the result launches in another activity.
        } 
        else if (resultCode == RESULT_CANCELED)
        {
            // Handle cancel
        }
    }
}
@Override
public void onBackPressed() {
   this.finish();
   return;
}
}

logcat -

04-13 01:24:47.355: E/AndroidRuntime(2575): FATAL EXCEPTION: main
04-13 01:24:47.355: E/AndroidRuntime(2575): java.lang.RuntimeException: Unable to pause activity {bhavik.smart.shopping/bhavik.smart.shopping.NoteEdit}: java.lang.NumberFormatException: Invalid int: ""
04-13 01:24:47.355: E/AndroidRuntime(2575):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2706)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2662)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2640)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at android.app.ActivityThread.access$800(ActivityThread.java:123)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at android.os.Looper.loop(Looper.java:137)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at android.app.ActivityThread.main(ActivityThread.java:4424)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at java.lang.reflect.Method.invokeNative(Native Method)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at java.lang.reflect.Method.invoke(Method.java:511)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at dalvik.system.NativeStart.main(Native Method)
04-13 01:24:47.355: E/AndroidRuntime(2575): Caused by: java.lang.NumberFormatException: Invalid int: ""
04-13 01:24:47.355: E/AndroidRuntime(2575):     at java.lang.Integer.invalidInt(Integer.java:138)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at java.lang.Integer.parseInt(Integer.java:359)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at java.lang.Integer.parseInt(Integer.java:332)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at bhavik.smart.shopping.NoteEdit.saveState(NoteEdit.java:138)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at bhavik.smart.shopping.NoteEdit.onPause(NoteEdit.java:126)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at android.app.Activity.performPause(Activity.java:4563)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1195)
04-13 01:24:47.355: E/AndroidRuntime(2575):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2693)
04-13 01:24:47.355: E/AndroidRuntime(2575):     ... 12 more

2 个答案:

答案 0 :(得分:2)

由于行

,你正在关闭一个力量
int quantity =Integer.parseInt( mquantityint.getText().toString());
int barcode =Integer.parseInt( mbarcodeint.getText().toString());
在saveState()中

。当你按下后退按钮时,其中一个TextView是空的。

请注意错误日志中的这一行

 java.lang.NumberFormatException: Invalid int: ""

在无效字符串上运行parseInt时抛出此异常。在这种情况下,它告诉你字符串是空的。在运行parseInt之前,您需要检查字符串是否为空,或者在方法周围抛出try catch。

祝你好运。

答案 1 :(得分:0)

Result.setText("");  

从您的代码中解析为字符串,以获得numberformat异常。 只需检查简单的条件,然后将其转换为整数,如下面的::

if(Result.getText()!="" ||Result.getText()!=null)
 int barcode =Integer.parseInt( mbarcodeint.getText().toString());
else
 int barcode =0;

在上面你可以删除其他部分作为[你的要求