java - button.performclick() java.lang.NullPointerException
问题描述
我正在尝试修改应用程序以添加其他功能。我有一个看起来像这样的功能
public class MainActivity extends Activity implements RadioGroup.OnCheckedChangeListener {
private static final int REQUEST_SELECT_DEVICE = 1;
private static final int REQUEST_ENABLE_BT = 2;
public static final String TAG = "nRFUART";
private static final String TAG1 = "smsTAG";
private static final int UART_PROFILE_CONNECTED = 20;
private static final int UART_PROFILE_DISCONNECTED = 21;
public static String content = null;
private int mState = UART_PROFILE_DISCONNECTED;
private UartService mService = null;
private BluetoothDevice mDevice = null;
private BluetoothAdapter mBtAdapter = null;
private ListView messageListView;
private ArrayAdapter<String> listAdapter;
public Button btnConnectDisconnect,btnSend;
private EditText edtMessage;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBtAdapter == null) {
Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();
}else{
btnConnectDisconnect=(Button) findViewById(R.id.btn_select);
btnSend=(Button) findViewById(R.id.sendButton);
edtMessage = (EditText) findViewById(R.id.sendText);
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
messageListView = (ListView) findViewById(R.id.listMessage);
listAdapter = new ArrayAdapter<String>(this, R.layout.message_detail);
messageListView.setAdapter(listAdapter);
messageListView.setDivider(null);
//Call receiveBroadCast like this
receiveBroadCast(getIntent().getStringExtra("message"));
service_init();
}
...
// Handle Send button
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText editText = (EditText) findViewById(R.id.sendText);
// String message = editText.getText().toString();
String message = content;
byte[] value;
try {
//send data to service
value = message.getBytes("UTF-8");
mService.writeRXCharacteristic(value);
//Update the log with time stamp
String currentDateTimeString = DateFormat.getTimeInstance().format(new Date());
listAdapter.add("["+currentDateTimeString+"] TX: "+ message);
messageListView.smoothScrollToPosition(listAdapter.getCount() - 1);
edtMessage.setText("");
Log.i(TAG1, "success, value: " + value + " message: " + message);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.i(TAG1, "fail" + e.toString());
}
}
});
...
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void receiveBroadCast(String text) {
btnSend=(Button) findViewById(R.id.sendButton);
Log.i(TAG1, "test " + text);
try {
Log.i(TAG1, "success " + text);
content = text;
btnSend.performClick();
} catch (Exception e) {
Log.i(TAG1, "fail " + e.toString());
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
但是当我运行代码时,我得到了错误
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference
这是包含我的按钮的 main.xml 文件
<Button
android:id="@+id/sendButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="0dp"
android:layout_marginBottom="0dp"
android:enabled="false"
android:text="Send" />
知道是什么导致了这个错误吗?
每次我向接收广播提供字符串时,我都试图让我的接收广播自动单击发送按钮。
这是我用来调用 receiveBroadcast 的 SMSReceiver 类:
public class SmsReceiver extends BroadcastReceiver {
private static final String TAG = "MyBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
if (bundle != null){
try{
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for(int i=0; i<msgs.length; i++){
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
String msgBody = msgs[i].getMessageBody();
Log.i(TAG, " success " + msgBody);
MainActivity Text = new MainActivity();
Text.receiveBroadCast(msgBody);
Intent intentsms = new Intent(context, MainActivity.class);
intentsms.putExtra("message", msgBody);
context.startActivity(intentsms);
}
} catch(Exception e) {
Log.i(TAG, e.toString());
}
}
}
}
}
解决方案
让那件事为你工作。您必须将 LocalBroadCastManager 发送到 MainActivity,然后您必须在那里获取该数据才能执行您的操作。
检查以下实现:
public class MainActivity extends Activity implements RadioGroup.OnCheckedChangeListener {
private static final int REQUEST_SELECT_DEVICE = 1;
private static final int REQUEST_ENABLE_BT = 2;
public static final String TAG = "nRFUART";
private static final String TAG1 = "smsTAG";
private static final int UART_PROFILE_CONNECTED = 20;
private static final int UART_PROFILE_DISCONNECTED = 21;
public static String content = null;
private int mState = UART_PROFILE_DISCONNECTED;
private UartService mService = null;
private BluetoothDevice mDevice = null;
private BluetoothAdapter mBtAdapter = null;
private ListView messageListView;
private ArrayAdapter<String> listAdapter;
public Button btnConnectDisconnect,btnSend;
private EditText edtMessage;
private BroadcastReceiver myMessageRec = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Get extra data included in the Intent
String message = intent.getStringExtra("message");
Log.d("receiver", "Got message: " + message);
receiveBroadCast(message);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LocalBroadcastManager.getInstance(MainActivity.this).registerReceiver(myMessageRec,
new IntentFilter("myMessage"));
btnConnectDisconnect = (Button) findViewById(R.id.btn_select);
btnSend = (Button) findViewById(R.id.sendButton);
edtMessage = (EditText) findViewById(R.id.sendText);
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
messageListView = (ListView) findViewById(R.id.listMessage);
listAdapter = new ArrayAdapter<String>(this, R.layout.message_detail);
messageListView.setAdapter(listAdapter);
messageListView.setDivider(null);
service_init();
// Handle Send button
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText editText = (EditText) findViewById(R.id.sendText);
// String message = editText.getText().toString();
String message = content;
byte[] value;
try {
//send data to service
value = message.getBytes("UTF-8");
mService.writeRXCharacteristic(value);
//Update the log with time stamp
String currentDateTimeString = DateFormat.getTimeInstance().format(new Date());
listAdapter.add("[" + currentDateTimeString + "] TX: " + message);
messageListView.smoothScrollToPosition(listAdapter.getCount() - 1);
edtMessage.setText("");
Log.i(TAG1, "success, value: " + value + " message: " + message);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.i(TAG1, "fail" + e.toString());
}
}
});
}
public void receiveBroadCast(String text) {
Log.i(TAG1, "test " + text);
try {
Log.i(TAG1, "success " + text);
content = text;
btnSend.performClick();
} catch (Exception e) {
Log.i(TAG1, "fail " + e.toString());
}
}
@Override
protected void onDestroy() {
// Unregister since the activity is about to be closed.
LocalBroadcastManager.getInstance(MainActivity.this).unregisterReceiver(myMessageRec);
super.onDestroy();
}
}
SmsReceiver 将如下所示:
public class SmsReceiver extends BroadcastReceiver {
private static final String TAG = "MyBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "";
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++){
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
str += "SMS from " + msgs[i].getOriginatingAddress();
str += " :";
str += msgs[i].getMessageBody().toString();
str += "\n";
}
}
Intent intentsms = new Intent("myMessage");
intentsms.putExtra("message", str);
LocalBroadcastManager.getInstance(context).sendBroadcast(intentsms);
}
}
}
推荐阅读
- sqlite - 使用 Sequelize 和 Sequelite 播种初始数据库:SQLITE_ERROR: no such table
- python - python - 了解 librosa.stft 输出形状
- angular - 在 ngIf else 模板中调用(单击)函数时出错
- c++ - 为什么 sizeof() 不打印 16 个字节而不是 8 个字节?
- authentication - 如何以编程方式使用 Symfony 登录用户?
- angular - SSR 节点服务器中的 http-proxy-middleware 不重定向本地请求
- visual-studio - Visual Studio Professional 2019 不会通过未找到的常用工具构建项目 - 以代码 -1073741819 退出
- c# - 服务更改返回类型后使用 WCF 服务获取错误
- angular - '未处理的承诺拒绝:','无法匹配任何路由。URL 段:'测试'',
- spring-boot - 禁用 Spring 相关的 Vault 检查