如何将资源ID作为参数传递;没有NullPointerException

时间:2015-03-06 17:09:41

标签: java android nullpointerexception android-resources android-identifiers

使用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()的方法,就像上面的代码一样,这样我就可以实例化该类的新对象,然后调用{{1}中的方法那样,我就不必像以前那样重写每个类中的计时器代码。

我试图像这样参数化方法:

onCreate()

我不断得到的是一个NullPointerException,它指向我的类CustomTimerActivity cGT = new CustomTimerActivity(); cGT.tTimer(7000, ColdActivity.this, R.id.countDown_timer, R.id.timer_button_start, R.id.timer_button_cancel);

为什么我无法将资源ID作为参数传递?或者NPE来自其他东西?

enter image description here

以下是我制作的CustomTimerActivity

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(); } }); } } 和用作输入的ID有关,对吗?

这是调用Intent时得到的另一个NullPointerException。

Logcat2

1 个答案:

答案 0 :(得分:1)

尚未在构造函数中初始化Activity。只收集构造函数中的参数并在onCreate(Bundle)方法中进行初始化!

但是,如果你想从一个givin活动中调用它,你必须在该类上调用.findViewById,而不是在你自己的类上调用