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

How to Pass a Resource Id as a Parameter; without NullPointerException

正在开发一个 Android 应用程序,其中每个 activity 都有自己的计时器。最初我在 每个 class

中都有这样的代码
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();
        }
    });
}

我现在正在尝试创建一个新的 class,它有一个名为 tTimer() 的方法,就像上面的代码一样,这样我就可以实例化那个 class 的新对象,然后调用 onCreate() 中的方法,这样我就不必像以前那样在每个 class 中重写计时器代码。

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

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

我不断得到的是 NullPointerException,它指向我的 class 调用 CustomTimerActivity

为什么我无法将资源 ID 作为参数传递?还是 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() 和用作输入的 Id 有关,对吗?

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

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

但是,如果你想从 givin activity 调用它,你必须在那个 class 上调用 .findViewById,而不是你自己 class