我正在开发一个QRCode应用程序,它能够注意到QRCode是一个URL,因此它会自动在手机上的Web浏览器上搜索它(或者甚至只是拥有它所以它可以超链接,你必须点击它)。我收到了这个错误:
尝试调用虚方法' void android.widget.TextView.setText(java.lang.CharSequence)'在空对象引用上
有什么想法吗?
package com.varvet.barcodereadersample;
import android.content.Intent;
import android.graphics.Point;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.vision.barcode.Barcode;
import com.varvet.barcodereadersample.barcode.BarcodeCaptureActivity;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class MainActivity extends AppCompatActivity {
private static final String LOG_TAG = MainActivity.class.getSimpleName();
private static final int BARCODE_READER_REQUEST_CODE = 1;
private TextView mResultTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mResultTextView = (TextView) findViewById(R.id.text);
Button scanBarcodeButton = (Button) findViewById(R.id.scan_barcode_button);
scanBarcodeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(), BarcodeCaptureActivity.class);
startActivityForResult(intent, BARCODE_READER_REQUEST_CODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == BARCODE_READER_REQUEST_CODE) {
if (resultCode == CommonStatusCodes.SUCCESS) {
if (data != null) {
Barcode barcode = data.getParcelableExtra(BarcodeCaptureActivity.BarcodeObject);
Point[] p = barcode.cornerPoints;
mResultTextView.setText(barcode.displayValue);
try{
URL url = new URL ("" + mResultTextView.getText());
URLConnection conn = url.openConnection();
conn.connect();
} catch (MalformedURLException e) {
mResultTextView.setText("invalid url");
} catch (IOException e) {
mResultTextView.setText("no connection to url placed");
}
} else mResultTextView.setText(R.string.no_barcode_captured);
} else Log.e(LOG_TAG, String.format(getString(R.string.barcode_error_format),
CommonStatusCodes.getStatusCodeString(resultCode)));
} else super.onActivityResult(requestCode, resultCode, data);
}
}
答案 0 :(得分:0)
您正在将int
传递给方法,该方法将假设它是一个字符串资源或您正在某处传递null
:
setText(CharSequence);
或
setText(int_resource_like_R.string.something);
在这里做什么:
首先检查String
是否为空或如下所示为空:
if(!TextUtils.isEmpty(String.valueOf(barcode.displayValue))){
}
如果没有,那么在if块中你有两个替代方法!
该方法认为您传递的是R.string.something
之类的字符串资源,因此请通过两种方式进行更改:
的第一强>
mResultTextView.setText(""+barcode.displayValue);
这将连接String
,它将使int
在Java中自动成为一个字符串。另一种方式是:
的第二强>
mResultTextView.setText(String.valueOf(barcode.displayValue));
这会将你的int转换为String,然后显示你的文字。
答案 1 :(得分:0)
你的问题
空对象引用上的方法'void android.widget.TextView.setText(java.lang.CharSequence)'
如果barcode.displayValue
的类型不是String
,则应将其解析为String
。
if(!TextUtils.isEmpty(String.valueOf(barcode.displayValue))){
mResultTextView.setText(String.valueOf(barcode.displayValue));
}
修改强>
根据@Mike M.的评论。
你的xml代码中可以有R.id.text
吗?
检查一下。
mResultTextView = (TextView) findViewById(R.id.text);
示例
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
你有android:id="@+id/text"
吗?