我的应用程序通知的“设置警报”按钮在OnClickListener上获取NullPointerException

问题描述 投票:0回答:1

我正在尝试从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类中的代码有缺陷?我看不出问题出在哪里,我希望比我更熟练的人可以看到我在代码中失败的地方。

朝正确的方向推进将非常感激

java android broadcastreceiver android-notifications intentservice
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.