简体   繁体   中英

NullPointerException when trying to open ZXingScannerView

I'm new to Android development so please bear with me. I have the code inside an activity that implements qr scanning. Basically there is an activity before this segments of codes, but its just clicking of a button to go here. and whenever I do that, my app crashes and that is the error that returns. The idea of the app is once the user click the button, it will first display a qr scanner, once it has been scanned, it will now call this XML File

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_scan"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="@drawable/scanbg"
tools:context=".ScanActivity">

<RelativeLayout
    android:layout_width="300dp"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_marginLeft="25dp"
    android:layout_marginRight="25dp"
    android:layout_marginTop="62dp"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Question Here"
        android:textSize="22dp"
        android:id="@+id/questionhere"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/questionhere"
        android:hint="Answer"
        android:id="@+id/answerhere"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Correct or not indicator"
        android:id="@+id/indicator"
        android:layout_below="@id/answerhere"
        android:textSize="18dp"/>
    <!--this textview will be programmed to be changed as correct or not-->
    <!--if answer == correct then "correct!" else "wrong answer"-->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Point(s):"
        android:id="@+id/userpoints"
        android:layout_below="@id/indicator"
        android:textSize="18dp"/>

    <Button
        android:layout_marginTop="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/userpoints"
        android:layout_alignParentEnd="true"
        android:text="Go"
        android:textSize="14dp"
        android:background="#B0DAD5"
        android:id="@+id/gosagot"/>

</RelativeLayout>

and Here is the java file

public class ScanActivity extends AppCompatActivity implements ZXingScannerView.ResultHandler{

Button validateanswer;
ProgressDialog progress;
private ZXingScannerView mScannerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scan);

    mScannerView = new ZXingScannerView(this);
    setContentView(mScannerView);
    mScannerView.setResultHandler(this);
    mScannerView.startCamera();

    validateanswer = (Button)findViewById(R.id.gosagot);                  //Im having error here
    validateanswer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            progress.setMessage("Connecting...");
            progress.setCancelable(false);
            progress.show();

            EditText theanswer = (EditText)findViewById(R.id.answerhere);
            String sagotdito = theanswer.getText().toString();
            RequestFactory.confirmanswer(ScanActivity.this, sagotdito, new RequestCallback<Boolean>() {
                @Override
                public void onSuccess(Boolean response) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            finish();
                            //load new question
                            progress.dismiss();
                        }
                    });
                }

                @Override
                public void onFailed(String message) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(ScanActivity.this, "Wrong Answer. Try Again!", Toast.LENGTH_LONG).show();
                            progress.dismiss();
                        }
                    });
                }
            });
        }
    });
}

continuation...

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


@Override
public void handleResult(final Result result) {
    Log.w("handleResult",result.getText());
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    final EditText answertoQuestion = new EditText(this);
    answertoQuestion.setHint("answer");
    builder.setTitle("Scan Result");
    builder.setMessage(result.getText());
    builder.setPositiveButton("Go", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            setContentView(R.layout.activity_scan);
            TextView j = (TextView)findViewById(R.id.questionhere);
            EditText k = (EditText)findViewById(R.id.answerhere);
            String n = k.getText().toString();
            j.setText(result.getText());

        }
    });
    AlertDialog alertDialog = builder.create();
    alertDialog.show();
}
}

please help me.

The problem is that the button is a part of activity_scan and you set setContentView(mScannerView) to other layout.You are bound to get this error as the activity does not have a refernce to the view(button) you are refering.

What you can do is make the mScannerView a part of your main layout and then get it with findViewById();

If you check the examples of ZXing ...

In your activity XML, you can add a region for the QR scanner.

 <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> 

Grab that and add the scanner view there.

 public class ScannerActivity extends AppCompatActivity implements ZXingScannerView.ResultHandler { private ZXingScannerView mScannerView; @Override public void onCreate(Bundle state) { super.onCreate(state); setContentView(R.layout.activity_simple_scanner); ViewGroup contentFrame = (ViewGroup) findViewById(R.id.content_frame); mScannerView = new ZXingScannerView(this); contentFrame.addView(mScannerView); } 

Your error is that you can't findViewById on your button when you replaced the content view with some other view that doesn't have the ID you want to find.

And even if you "switched" findViewById and setContentView around, your code wouldn't crash, but you would no longer have a button in the content view, so having the click action would be pointless.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM