java - 如何将资源 ID 作为参数传递;没有空指针异常

标签 java android nullpointerexception android-resources android-identifiers

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

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

的类

为什么我无法将资源 ID 作为参数传递?还是 NPE 来自其他地方?

enter image description here

这是我制作的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。

Logcat2

最佳答案

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

但是,如果您想从 givin Activity 中调用它,则必须在该类上调用 .findViewById,而不是在您自己的类上调用 .findViewById

关于java - 如何将资源 ID 作为参数传递;没有空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28903948/

相关文章:

java - 混淆何时使用私有(private)字段与 protected 字段

java - 致命异常 : main Caused by: java. playAudio 处的 lang.NullPointerException(extras.getInt(MEDIA));

android - 统计签到次数

android - Phonegap 在 webview 中禁用 x-frame-option

c++ - 在大型 C++ 代码库中避免空指针异常

java - 向 ActionBar 项目添加监听器,onOptionsItemSelected NullPointerException

java - 如何在 Windows 上的 eclipse 中运行 nutch 1.9?

java - 重新审视 Jon Skeet 在他的文章中发布的 Java 中的按值传递语义

java - 如何在tomcat上部署java应用并在线访问

android - 无法将 ImageBitmap 从 Canvas 位图设置到 ImageView