我正在尝试从Weather App实施每日通知,但不断收到此错误:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.example.weatherapptwo.MainActivity.onCreate(MainActivity.java:47)
我已经在此处编辑了完整的MainActivity代码:
public class MainActivity extends AppCompatActivity {
private static final String API_KEY = "blabla";
TextView cityText, weatherUpdateText, weatherTypeText, temperatureText, minTempText, maxTempText, sunriseText, sunsetText, windSpeedText,
pressureText, humidityPrcntText, timezoneText;
35. Button setTheAlarm;
36.
37.
38. @Override
39. protected void onCreate(Bundle savedInstanceState) {
40.
41. super.onCreate(savedInstanceState);
42. setContentView(R.layout.activity_main);
43.
44.
45. setTheAlarm = (Button) findViewById(R.id.setAlarm);
46.
47. setTheAlarm.setOnClickListener(new View.OnClickListener() {
48. @Override
49. public void onClick(View v) {
50. NotificationEventReceiver.setupAlarm(getApplicationContext());
51. }
52. });
53.
cityText = findViewById(R.id.address);
weatherUpdateText = findViewById(R.id.weatherUpdateAt);
weatherTypeText = findViewById(R.id.weatherType);
temperatureText = findViewById(R.id.temperature);
minTempText = findViewById(R.id.minTemp);
maxTempText = findViewById(R.id.maxTemp);
sunriseText = findViewById(R.id.sunrise);
sunsetText = findViewById(R.id.sunset);
windSpeedText = findViewById(R.id.windSpeed);
pressureText = findViewById(R.id.pressure);
humidityPrcntText = findViewById(R.id.humidity);
timezoneText = findViewById(R.id.tz);
final EditText searchEdit = (EditText) findViewById(R.id.cityEdtText);
final Button submit = (Button) findViewById(R.id.searchButton);
submit.setOnClickListener(new Button.OnClickListener() {
public void onClick(View view) {
new WeatherTask().execute();
}
});
searchEdit.setOnEditorActionListener(new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {
submit.performClick();
}
return false;
}
});
final SwipeRefreshLayout pullToRefresh = findViewById(R.id.pullToRefresh);
pullToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
cityText.setText("CITY,COUNTRY");
weatherUpdateText.setText("-,-PM");
weatherTypeText.setText("-");
temperatureText.setText("-°C");
minTempText.setText("Min Temp");
maxTempText.setText("Max Temp");
sunriseText.setText("-");
sunsetText.setText("-");
windSpeedText.setText("-");
pressureText.setText("-");
humidityPrcntText.setText("-");
timezoneText.setText("-");
new WeatherTask().execute();
pullToRefresh.setRefreshing(false);
}
});
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
这是我的XML布局文件:
<?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/pullToRefresh"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background_color"
android:orientation="vertical"
android:padding="25dp">
<RelativeLayout
android:id="@+id/mainContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible">
<LinearLayout
android:id="@+id/cityCountryContainer"
android:layout_width="match_parent"
android:layout_height="251dp"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-black"
android:text="@string/city_country"
android:textColor="#FFFFFF"
android:textSize="24sp" />
<Space
android:layout_width="wrap_content"
android:layout_height="45dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="133dp"
android:gravity="center"
android:orientation="horizontal">
<Button
android:id="@+id/searchButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:fontFamily="sans-serif-black"
android:onClick="searchButton"
android:text="@string/search"
android:textColor="#FFFFFF"
android:textSize="18sp" />
<Space
android:layout_width="20dp"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/cityEdtText"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_marginTop="5dp"
android:backgroundTint="@android:color/white"
android:fontFamily="sans-serif-black"
android:hint="@string/enter_city"
android:inputType="text"
android:textAlignment="center"
android:textColor="#FFFFFF"
android:textColorHint="#FFFFFF"
android:textSize="18sp"
tools:targetApi="o"
tools:ignore="ObsoleteLayoutParam"
android:autofillHints="Enter a city name">
</EditText>
<Space
android:layout_width="20dp"
android:layout_height="wrap_content" />
<Button
android:id="@+id/setAlarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:fontFamily="sans-serif-black"
android:onClick="setAlarm"
android:text="@string/setalarm"
android:textColor="#FFFFFF"
android:textSize="18sp" />
</LinearLayout>
<Space
android:layout_width="wrap_content"
android:layout_height="45dp" />
<TextView
android:id="@+id/weatherUpdateAt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-black"
android:text="@string/pm"
android:textColor="#FFFFFF"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/informationContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="3">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
android:padding="8dp">
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/pressure"
android:tint="#FFFFFF"
android:contentDescription="@string/pressurelogo" />
<Space
android:layout_width="wrap_content"
android:layout_height="5dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pressure"
android:fontFamily="sans-serif-black"
android:textColor="@color/white"
android:textSize="12sp" />
<TextView
android:id="@+id/pressure"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strack"
android:fontFamily="sans-serif-black"
android:textColor="@color/white"
android:textSize="14sp" />
</LinearLayout>
<Space
android:layout_width="10dp"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
android:padding="8dp">
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/timezone"
android:tint="#FFFFFF"
android:contentDescription="@string/timezonelogo" />
<Space
android:layout_width="wrap_content"
android:layout_height="5dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/timezone"
android:fontFamily="sans-serif-black"
android:textColor="@color/white"
android:textSize="12sp" />
<TextView
android:id="@+id/tz"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/stre"
android:fontFamily="sans-serif-black"
android:textColor="@color/white"
android:textSize="14sp" />
</LinearLayout>
<Space
android:layout_width="10dp"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
android:padding="8dp">
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/wind"
android:tint="#FFFFFF"
android:contentDescription="@string/windlogo" />
<Space
android:layout_width="wrap_content"
android:layout_height="5dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/wind"
android:fontFamily="sans-serif-black"
android:textColor="@color/white"
android:textSize="12sp" />
<TextView
android:id="@+id/windSpeed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:text="@string/strk"
android:fontFamily="sans-serif-black"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
<Space
android:layout_width="wrap_content"
android:layout_height="10dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="3">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
android:padding="8dp">
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/sunrise"
android:tint="#FFFFFF"
android:contentDescription="@string/sunriselogo" />
<Space
android:layout_width="wrap_content"
android:layout_height="5dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/sunrise"
android:textColor="@color/white"
android:fontFamily="sans-serif-black"
android:textSize="12sp" />
<TextView
android:id="@+id/sunrise"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:fontFamily="sans-serif-black"
android:text="@string/strick"
android:textSize="14sp" />
</LinearLayout>
<Space
android:layout_width="10dp"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
android:padding="8dp">
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/sunset"
android:tint="#FFFFFF"
android:contentDescription="@string/sunsetlogo" />
<Space
android:layout_width="wrap_content"
android:layout_height="5dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/sunset"
android:fontFamily="sans-serif-black"
android:textColor="@color/white"
android:textSize="12sp" />
<TextView
android:id="@+id/sunset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:text="@string/strck"
android:fontFamily="sans-serif-black"
android:textSize="14sp" />
</LinearLayout>
<Space
android:layout_width="10dp"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
android:padding="8dp">
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/humidity"
android:tint="#FFFFFF"
android:contentDescription="@string/humiditylogo" />
<Space
android:layout_width="wrap_content"
android:layout_height="5dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:fontFamily="sans-serif-black"
android:text="@string/humidity"
android:textSize="12sp" />
<TextView
android:id="@+id/humidity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:text="@string/sreck"
android:fontFamily="sans-serif-black"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/centerContainer"
android:layout_width="match_parent"
android:layout_height="347dp"
android:layout_centerInParent="true"
android:orientation="vertical">
<Space
android:layout_width="wrap_content"
android:layout_height="90dp" />
<TextView
android:id="@+id/temperature"
android:layout_width="wrap_content"
android:layout_height="106dp"
android:layout_gravity="center"
android:text="@string/celsius"
android:textColor="#FFFFFF"
android:textSize="90sp" />
<Space
android:layout_width="wrap_content"
android:layout_height="30dp" />
<TextView
android:id="@+id/weatherType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:fontFamily="sans-serif-black"
android:text="@string/sreck"
android:textColor="#FFFFFF"
android:textSize="18sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="133dp"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/minTemp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-black"
android:text="@string/min_temp"
android:textColor="#FFFFFF" />
<Space
android:layout_width="50dp"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/maxTemp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-black"
android:text="@string/max_temp"
android:textColor="#FFFFFF" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
<ProgressBar
android:id="@+id/loadingCircle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone" />
<TextView
android:id="@+id/errorTxt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="@string/errorMessage"
android:visibility="gone" />
</RelativeLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
我的NotificationEventReceiver类:
public class NotificationEventReceiver extends BroadcastReceiver {
private static final String ACTION_START_NOTIFICATION_SERVICE = "ACTION_START_NOTIFICATION_SERVICE";
private static final String ACTION_DELETE_NOTIFICATION = "ACTION_DELETE_NOTIFICATION";
private static final String ACTION_ALARM_RECEIVER = "ACTION_ALARM_RECEIVER";
public static void setupAlarm(Context context) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, NotificationEventReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, getTriggerAt(new Date()), 2 * 60 * 1000, alarmIntent);
}
private static long getTriggerAt(Date now) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 37);
System.err.println(now.getTime() + "----->" + calendar.getTimeInMillis());
return calendar.getTimeInMillis();
}
public static void cancelAlarm(Context context){
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent alarmIntent = getStartPendingIntent(context);
alarmManager.cancel(alarmIntent);
}
private static PendingIntent getStartPendingIntent(Context context) {
Intent intent = new Intent(context, NotificationEventReceiver.class);
intent.setAction(ACTION_START_NOTIFICATION_SERVICE);
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
public static PendingIntent getDeleteIntent(Context context){
Intent intent = new Intent(context, NotificationEventReceiver.class);
intent.setAction(ACTION_DELETE_NOTIFICATION);
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
@Override
public void onReceive(Context context, Intent intent) {
Intent serviceIntent = NotificationIntentService.createIntentStartNotificationService(context);
if(serviceIntent != null){
System.err.println("onRecieve inside not null");
// Start the service, keeping the device awake while it is launching.
startWakefulService(context, serviceIntent);
}
}
}
我的NotificationIntentService类:
public class NotificationIntentService extends IntentService {
private static final int NOTIFICATION_ID = 1;
private static final String ACTION_START = "ACTION_START";
private static final String ACTION_DELETE = "ACTION DELETE";
public NotificationIntentService(String name) {
super(NotificationIntentService.class.getSimpleName());
}
public static Intent createIntentStartNotificationService(Context context) {
Intent intent = new Intent(context, NotificationIntentService.class);
intent.setAction(ACTION_START);
return intent;
}
@Override
protected void onHandleIntent(Intent intent) {
System.err.println("onHandleIntent, started handling a notification event");
try {
String action = intent.getAction();
if (ACTION_START.equals(action)) {
System.err.println("enters the loop ACTION_START");
processStartNotification();
}
} finally {
completeWakefulIntent(intent);
}
}
private void processStartNotification() {
// Do something. For example, fetch fresh data from backend to create a rich notification?
System.err.println("inside the notify method");
Intent mainIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, NOTIFICATION_ID, mainIntent, PendingIntent.FLAG_UPDATE_CURRENT);
final NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentTitle("Scheduled Notification")
.setAutoCancel(true)
.setColor(getResources().getColor(R.color.colorAccent))
.setContentText("This notification has been triggered by Notification Service")
.setSmallIcon(R.drawable.sunrise);
builder.setContentIntent(pendingIntent);
final NotificationManager manager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(NOTIFICATION_ID, builder.build());
}
有人知道可能是什么问题吗?是MainActivity中的问题,还是我的Notification类中的代码有缺陷?我看不出问题出在哪里,我希望比我更熟练的人可以看到我在代码中失败的地方。
朝正确的方向推进将非常感激