Как передать идентификатор ресурса в качестве параметра; без NullPointerException

Работа над приложением Android, где у каждого действия есть свой таймер. Первоначально у меня был такой код в каждом классе

public void tTimer() {
    mTextField = (TextView) findViewById(R.id.countDown_timer);

    final CountDownTimer tCounter = new CountDownTimer(7000, 1000) {

        @Override
        public void onTick(long millisUntilFinished) {
            mTextField
                    .setText("Time Remaining: "
                            + String.format(
                                    "%d min,  %d sec",
                                    TimeUnit.MILLISECONDS
                                            .toMinutes(millisUntilFinished),
                                    TimeUnit.MILLISECONDS
                                            .toSeconds(millisUntilFinished)
                                            - TimeUnit.MINUTES
                                                    .toSeconds(TimeUnit.MILLISECONDS
                                                            .toMinutes(millisUntilFinished))));

        }

        @Override
        public void onFinish() {
            mTextField.setText("Done!");
            Intent i = new Intent (ColdActivity.this, PopUpActivity.class);
            startActivity(i);
        }
    };

    Button startButton = (Button) findViewById(R.id.timer_button_start);
    /* When the Start Button is touched, the Countdown Timer will start */

    startButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            AlertDialog.Builder builder = new AlertDialog.Builder(
                    ColdActivity.this);

            builder.setNegativeButton("Dismiss",
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface arg0, int arg1) {
                            tCounter.start();
                            // Once the user has been notified that they should increase
                            // their alarm volume, and they dismiss the notification, the timer
                            // will start
                        }
                    });

            builder.setTitle("Notification");
            builder.setMessage("It is recommended that you turn your Alarm/Ringtone volume on so that you can hear the alarm when it is finished");

            AlertDialog dlg = builder.create();

            dlg.show();
        }
    });

    Button stopButton = (Button) findViewById(R.id.timer_button_cancel);
    /* When the Stop Button is touched, the Countdown Timer will stop */
    stopButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            tCounter.cancel();
        }
    });
}

Я сейчас пытаюсь создать новый класс, который имеет метод с именем tTimer() как в приведенном выше коде, так что я могу создать новый объект этого класса, а затем вызвать метод в onCreate()Таким образом, мне не нужно переписывать код таймера в каждом классе, как я это делал ранее.

Я попытался параметризовать метод следующим образом:

CustomTimerActivity cGT = new CustomTimerActivity();
cGT.tTimer(7000, ColdActivity.this, R.id.countDown_timer, R.id.timer_button_start, R.id.timer_button_cancel);

И я продолжаю получать исключение NullPointerException, которое указывает на мой класс с именем CustomTimerActivity

Почему я не могу передать идентификатор ресурса в качестве параметров? Или NPE происходит от чего-то еще?

Здесь CustomTimerActivity Я сделал:

public class CustomTimerActivity extends Activity {

    TextView mTextField;
    int mId;

    public void tTimer(long millisecs, final Activity activity1, int tv, int start, int cancel) {

        mTextField = (TextView) findViewById(tv);

        final CountDownTimer tCounter = new CountDownTimer(millisecs, 1000) {

            @Override
            public void onTick(long millisUntilFinished) {
                mTextField
                        .setText("Time Remaining: "
                                + String.format(
                                "%d min,  %d sec",
                                TimeUnit.MILLISECONDS
                                        .toMinutes(millisUntilFinished),
                                TimeUnit.MILLISECONDS
                                        .toSeconds(millisUntilFinished)
                                        - TimeUnit.MINUTES
                                        .toSeconds(TimeUnit.MILLISECONDS
                                                .toMinutes(millisUntilFinished))));
            }

            @Override
            public void onFinish() {
                mTextField.setText("Done!");
                Intent i = new Intent (activity1, PopUpActivity.class);
                startActivity(i);
            }
        };

        Button startButton = (Button) findViewById(start);
        /* When the Start Button is touched, the Countdown Timer will start */

        startButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                AlertDialog.Builder builder = new AlertDialog.Builder(
                        activity1);

                builder.setNegativeButton("Dismiss",
                        new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface arg0, int arg1) {
                                tCounter.start();
                                // Once the user has been notified that they should increase
                                // their alarm volume, and they dismiss the notification, the timer
                                // will start
                            }
                        });

                builder.setTitle("Notification");
                builder.setMessage("It is recommended that you turn your Alarm/Ringtone volume on so that you can hear the alarm when your tea is finished");

                AlertDialog dlg = builder.create();

                dlg.show();
            }
        });

        Button stopButton = (Button) findViewById(cancel);
        /* When the Stop Button is touched, the Countdown Timer will stop */
        stopButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                tCounter.cancel();
            }
        });
    }
}

Вопрос должен быть как-то связан с findViewById() и идентификатор, который используется в качестве ввода, верно?

Вот еще одно исключение NullPointerException, которое я получаю при вызове Intent.

Logcat2

1 ответ

Решение

Операция не была инициализирована в конструкторе. Собирайте параметры только в конструкторе и выполняйте инициализацию в методе onCreate(Bundle)!

Однако, если вы хотите вызвать его из действия GIVIN, вы должны вызвать.findViewById для этого класса, а не для вашего собственного класса.

Другие вопросы по тегам