Android Studio运行时错误

时间:2016-03-14 20:22:19

标签: java android android-studio runtime-error findviewbyid

我在Android Studio中一直收到此错误:

  

java.lang.RuntimeException:无法实例化活动   ComponentInfo {dit.assignment3 / dit.assignment3.Timer}:   java.lang.NullPointerException:尝试调用虚方法   ' android.view.View android.view.Window.findViewById(int)'在null   对象参考

但我似乎无法在我的代码中找到错误的地方,尝试评论我所拥有的所有findViewById但没有运气。

代码:

public class Timer extends AppCompatActivity {       
    //declaring all items on page in class    
       EditText hoursIn = (EditText) findViewById(R.id.hoursET);   
       EditText minIn = (EditText) findViewById(R.id.minET);

       Button start = (Button) findViewById(R.id.startButton);
       Button stop = (Button) findViewById(R.id.stopButton);

       TextView textViewTime = (TextView) findViewById(R.id.timeDisp);


    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
      // private GoogleApiClient client;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timer);

        textViewTime.setText("00:00:30");

        final CounterClass timer = new CounterClass(30000, 1000);
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                timer.start();
            }
        });


        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                timer.cancel();
            }
        });
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        //client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
    }

    //@Override
    /*public void onStart() {
        super.onStart();

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client.connect();
        Action viewAction = Action.newAction(
                Action.TYPE_VIEW, // TODO: choose an action type.
                "Timer", // TODO: Define a title for the content shown.
                // TODO: If you have web page content that matches this app activity's content,
                // make sure this auto-generated web page URL is correct.
                // Otherwise, set the URL to null.
                Uri.parse("http://host/path"),
                // TODO: Make sure this auto-generated app deep link URI is correct.
                Uri.parse("android-app://dit.assignment3/http/host/path")
        );
        AppIndex.AppIndexApi.start(client, viewAction);
    }

    @Override
    public void onStop() {
        super.onStop();

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        Action viewAction = Action.newAction(
                Action.TYPE_VIEW, // TODO: choose an action type.
                "Timer Page", // TODO: Define a title for the content shown.
                // TODO: If you have web page content that matches this app activity's content,
                // make sure this auto-generated web page URL is correct.
                // Otherwise, set the URL to null.
                Uri.parse("http://host/path"),
                // TODO: Make sure this auto-generated app deep link URI is correct.
                Uri.parse("android-app://dit.assignment3/http/host/path")
        );
        AppIndex.AppIndexApi.end(client, viewAction);
        client.disconnect();
    }*/

       public class CounterClass extends CountDownTimer {

        /**
         * @param millisInFuture    The number of millis in the future from the call
         *                          to {@link #start()} until the countdown is done and {@link #onFinish()}
         *                          is called.
         * @param countDownInterval The interval along the way to receive
         *                          {@link #onTick(long)} callbacks.
         */
        public CounterClass(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        @Override
        public void onTick(long millisUntilFinished) {
            long millis = millisUntilFinished;
            String hrsminsec = String.format("%02:%02:%02", TimeUnit.MILLISECONDS.toHours(millis),
                    TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toMinutes(millis)),
                    TimeUnit.MILLISECONDS.toSeconds(millis - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toSeconds(millis)))
            );

            textViewTime.setText(hrsminsec);
        }

        @Override
        public void onFinish() {
            textViewTime.setText("DONE");
        }
    }
}

干杯

3 个答案:

答案 0 :(得分:1)

无法在findViewByIdonCreate之前调用{p> setContentView

围绕以下内容进行更改

EditText hoursIn;

public void onCreate(...){
    ...

    setContentView(...);

    hoursIn = (EditText) findViewById(R.id.hoursET);

    ...
}

原因是findViewById将查找当前显示的元素,在设置内容视图之前,找不到任何内容,从而留下findViewById的结果要 null

答案 1 :(得分:1)

您应该在创建窗口之前将findViewById调用放入您尝试分配它们的onCreate中。

EditText hoursIn;   
EditText minIn;

Button start;
Button stop;

TextView textViewTime;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_timer);
    hoursIn = (EditText) findViewById(R.id.hoursET);   
    minIn = (EditText) findViewById(R.id.minET);

    start = (Button) findViewById(R.id.startButton);
    stop = (Button) findViewById(R.id.stopButton);

    textViewTime = (TextView) findViewById(R.id.timeDisp);

答案 2 :(得分:0)

    You should assign all controls in onCreate()

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timer);
        EditText hoursIn = (EditText)  findViewById(R.id.hoursET);   
        EditText minIn = (EditText) findViewById(R.id.minET);
        textViewTime.setText("00:00:30");

        final CounterClass timer = new CounterClass(30000, 1000);
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                timer.start();
            }
        });