2014-07-16 170 views
-1

我相当新到Android,请不要介意为这个愚蠢的问题,但请不要回答这个问题,如果你知道...! 虽然我开始一个新的活动使用意图,但我的应用程序UNFORTUNATELY STOPPED当我开始新的activity.Error是java.lang.NullPointerException。 我在这里浪费了很多时间,我无法理解问题出在哪里。显示java.lang.NullPointerException错误

这是第一个活动:

package com.people.rock; 

import com.android.taskreminder.R; 

import android.app.ListActivity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.view.ContextMenu; 
import android.view.ContextMenu.ContextMenuInfo; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView.AdapterContextMenuInfo; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 

public class ReminderListActivity extends ListActivity { 

    private static final int ACTIVITY_CREATE=0; 
    //private static final int ACTIVITY_EDIT=1; 

    private RemindersDbAdapter mDbHelper; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.reminder_list); 

     mDbHelper = new RemindersDbAdapter(this); 
     mDbHelper.open(); 
     fillData(); 
     registerForContextMenu(getListView()); 

     } 
    @SuppressWarnings("deprecation") 
    private void fillData() { 
     Cursor remindersCursor = mDbHelper.fetchAllReminders(); 
     startManagingCursor(remindersCursor); 
     // Create an array to specify the fields we want (only the TITLE) 
     String[] from = new String[]{RemindersDbAdapter.KEY_TITLE}; 
     // and an array of the fields we want to bind in the view 
     int[] to = new int[]{R.id.text1}; 
     // Now create a simple cursor adapter and set it to display 
     SimpleCursorAdapter reminders = 
     new SimpleCursorAdapter(this, R.layout.reminder_row, remindersCursor, from, to); 
     setListAdapter(reminders); 
     } 



    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    Intent i = new Intent(this, ReminderEditActivity.class); 
    i.putExtra("RowId", id); 
    startActivity(i); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo 
    menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    MenuInflater mi = getMenuInflater(); 
    mi.inflate(R.menu.list_menu_item_longpress, menu); 
    } 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.reminder_list, menu); 
     MenuInflater mi = getMenuInflater(); 
     mi.inflate(R.menu.list_menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onMenuItemSelected(int featureId, MenuItem item) { 
     switch(item.getItemId()) { 
     case R.id.menu_insert: 
      createReminder(); 
      return true; 
    } 
    return super.onMenuItemSelected(featureId, item); 
    } 

    public boolean onContextItemSelected(MenuItem item) { 
     switch(item.getItemId()) { 
     case R.id.menu_delete: 
      AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
      mDbHelper.deleteReminder(info.id); 
      fillData(); 
      return true; 
    } 
    return super.onContextItemSelected(item); 
    } 


    private void createReminder() { 
    Intent i = new Intent(this, ReminderEditActivity.class); 
    startActivityForResult(i, ACTIVITY_CREATE); 
    } 


    protected void onActivityResult(int requestCode, int resultCode, Intent intent) 
    { 
    super.onActivityResult(requestCode, resultCode, intent); 
    fillData(); 
    } 



} 

这是新的活动,我使用意图调用。

package com.people.rock; 

    import java.text.ParseException; 
    import java.text.SimpleDateFormat; 
    import java.util.Calendar; 
    import java.util.Date; 

    import com.android.taskreminder.R; 

    import android.annotation.SuppressLint; 
    import android.app.Activity; 
    import android.app.DatePickerDialog; 
    import android.app.Dialog; 
    import android.app.TimePickerDialog; 
    import android.database.Cursor; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.DatePicker; 
    import android.widget.EditText; 
    import android.widget.TimePicker; 
    import android.widget.Toast; 

    @SuppressLint("SimpleDateFormat") public class ReminderEditActivity extends Activity { 

     // all variables are declared before content view and are initiated after it. 
     private Button mTimeButton; 
     private Button mDateButton; 
     private static final String DATE_FORMAT = "yyyy-MM-dd"; 
     private static final String TIME_FORMAT = "hour-minute"; 
     public static final String DATE_TIME_FORMAT = "yyyy-MM-dd kk:mm:ss"; 
     private static final int DATE_PICKER_DIALOG = 0; 
     private static final int TIME_PICKER_DIALOG = 1; 
     Calendar mCalendar; 
     private EditText mTitleText; 
     private Button mConfirmButton; 
     private EditText mBodyText; 
     private RemindersDbAdapter mDbHelper; 
     private Long mRowId; 

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

     registerButtonListnerAndSetDefaultText(); 

     //variable initiation 
      mDbHelper = new RemindersDbAdapter(this); 
      mDateButton=(Button) findViewById(R.id.reminder_date); 
      mTimeButton=(Button) findViewById(R.id.reminder_time); 

     mCalendar = Calendar.getInstance(); 

     mConfirmButton = (Button) findViewById(R.id.confirm); 

     mTitleText = (EditText) findViewById(R.id.title); 

     mBodyText = (EditText) findViewById(R.id.body); 

     //to check whether any previous state exist which might be closed by killing of activity 
     mRowId = savedInstanceState != null 
       ? savedInstanceState.getLong(RemindersDbAdapter.KEY_ROWID) 
       : null; 

     } 

     //to set id if we got it from intent declared in reminder_list activity 
     private void setRowIdFromIntent() { 
      if (mRowId == null) { 
      Bundle extras = getIntent().getExtras(); 
      mRowId = extras != null 
      ? extras.getLong(RemindersDbAdapter.KEY_ROWID) 
      : null; 
      } 
      } 

      @Override 
      protected void onPause() { 
      super.onPause(); 
      mDbHelper.close(); 
      } 

      @Override 
      protected void onResume() { 
      super.onResume(); 
      mDbHelper.open(); 
      setRowIdFromIntent(); 
      populateFields(); 
      } 

      //to fill the form of existing id which was killed by android 
      @SuppressWarnings("deprecation") 
      private void populateFields() { 
      if (mRowId != null) { 
      Cursor reminder = mDbHelper.fetchReminder(mRowId); 
      startManagingCursor(reminder); 
      mTitleText.setText(reminder.getString(
      reminder.getColumnIndexOrThrow(RemindersDbAdapter.KEY_TITLE))); 
      mBodyText.setText(reminder.getString(
      reminder.getColumnIndexOrThrow(RemindersDbAdapter.KEY_BODY))); 
      SimpleDateFormat dateTimeFormat = new SimpleDateFormat(DATE_TIME_FORMAT); 
      Date date = null; 
      try { 
      String dateString = reminder.getString(
      reminder.getColumnIndexOrThrow(RemindersDbAdapter.KEY_DATE_TIME)); 
      date = dateTimeFormat.parse(dateString); 
      mCalendar.setTime(date); 
      } catch (ParseException e) { 
       Log.e("ReminderEditActivity", e.getMessage(), e); 
      } 
      } 
      updateDateButtonText(); 
      updateTimeButtonText(); 
      } 

      @Override 
      protected void onSaveInstanceState(Bundle outState) { 
      super.onSaveInstanceState(outState); 
      outState.putLong(RemindersDbAdapter.KEY_ROWID, mRowId); 
      } 

       private void registerButtonListnerAndSetDefaultText(){ 
      mConfirmButton.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View view) { 
       saveState(); 
       setResult(RESULT_OK); 
       Toast.makeText(ReminderEditActivity.this,getString(R.string.task_saved_message),Toast.LENGTH_SHORT).show(); 
       finish(); 
       } 
       }); 
      mDateButton.setOnClickListener(new View.OnClickListener() { 
        @SuppressWarnings("deprecation") 
        @Override   
       public void onClick(View v) { 
        showDialog(DATE_PICKER_DIALOG); 
       } 
       }); 
      mTimeButton.setOnClickListener(new View.OnClickListener() { 
       @SuppressWarnings("deprecation") 
       @Override 
       public void onClick(View v) { 
        showDialog(TIME_PICKER_DIALOG); 
       } 
      }); 
       updateDateButtonText(); 
       updateTimeButtonText(); 
     } 

     @SuppressWarnings("deprecation") 
     protected Dialog onCreateDialog(int id) { 
       switch(id) { 
      case DATE_PICKER_DIALOG: 
       return showDatePicker(); 
      case TIME_PICKER_DIALOG: 
       return showTimePicker(); 
     } 
     return super.onCreateDialog(id); 
     } 

     @SuppressLint("SimpleDateFormat") private DatePickerDialog showDatePicker() { 
     DatePickerDialog datePicker = new DatePickerDialog(ReminderEditActivity.this ,new DatePickerDialog.OnDateSetListener() { 
     @Override 
     public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 

       mCalendar.set(Calendar.YEAR, year); 
       mCalendar.set(Calendar.MONTH, monthOfYear); 
       mCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 
         updateDateButtonText(); 
     } 
     }, mCalendar.get(Calendar.YEAR), mCalendar.get(Calendar.MONTH), mCalendar.get(Calendar.DAY_OF_MONTH)); 
       return datePicker; 
     } 
     private void updateDateButtonText() { 
     SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT); 
     String dateForButton = dateFormat.format(mCalendar.getTime()); 
     mDateButton.setText(dateForButton); 
     } 

     private TimePickerDialog showTimePicker() { 
      TimePickerDialog timePicker = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() { 
      @SuppressLint("SimpleDateFormat") @Override 
      public void onTimeSet(TimePicker view, int hourOfDay, int minute){ 
      mCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay); 
      mCalendar.set(Calendar.MINUTE, minute); 
      updateTimeButtonText(); 
      } 
      }, mCalendar.get(Calendar.HOUR_OF_DAY), 
      mCalendar.get(Calendar.MINUTE), true); 
      return timePicker; 
      } 
     @SuppressLint("SimpleDateFormat") private void updateTimeButtonText() { 
      SimpleDateFormat TimeFormat = new SimpleDateFormat(TIME_FORMAT); 
      String timeForButton = TimeFormat.format(mCalendar.getTime()); 
      mDateButton.setText(timeForButton); 
      } 

     private void saveState() { 
      String title = mTitleText.getText().toString(); 
      String body = mBodyText.getText().toString(); 
      SimpleDateFormat dateTimeFormat = new SimpleDateFormat(DATE_TIME_FORMAT); 
      String reminderDateTime = dateTimeFormat.format(mCalendar.getTime()); 
      if (mRowId == null) { 
       long id = mDbHelper.createReminder(title, body, reminderDateTime); 

       if (id > 0) { 
       mRowId = id; 
       } 
       } else { 
       mDbHelper 
       .updateReminder(mRowId, title, body, reminderDateTime); 
       } 
      new ReminderManager(this).setReminder(mRowId, mCalendar); 
       } 
        } 

这是我得到提前

07-16 08:04:30.620: D/dalvikvm(945): GC_FOR_ALLOC freed 44K, 4% free 3054K/3168K, paused 35ms, total 38ms 
07-16 08:04:30.630: I/dalvikvm-heap(945): Grow heap (frag case) to 3.520MB for 500416-byte allocation 
07-16 08:04:30.670: D/dalvikvm(945): GC_FOR_ALLOC freed 2K, 4% free 3540K/3660K, paused 33ms, total 33ms 
07-16 08:04:31.570: I/Choreographer(945): Skipped 38 frames! The application may be doing too much work on its main thread. 
07-16 08:04:31.800: D/gralloc_goldfish(945): Emulator without GPU emulation detected. 
07-16 08:11:32.195: D/dalvikvm(945): GC_FOR_ALLOC freed 56K, 4% free 3717K/3840K, paused 108ms, total 109ms 
07-16 08:11:32.195: I/dalvikvm-heap(945): Grow heap (frag case) to 4.142MB for 474384-byte allocation 
07-16 08:11:32.425: D/dalvikvm(945): GC_FOR_ALLOC freed 13K, 4% free 4167K/4304K, paused 53ms, total 53ms 
07-16 08:11:32.685: D/AndroidRuntime(945): Shutting down VM 
07-16 08:11:32.685: W/dalvikvm(945): threadid=1: thread exiting with uncaught exception (group=0xb3a62ba8) 
07-16 08:11:32.715: E/AndroidRuntime(945): FATAL EXCEPTION: main 
07-16 08:11:32.715: E/AndroidRuntime(945): Process: com.android.taskreminder, PID: 945 
07-16 08:11:32.715: E/AndroidRuntime(945): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.taskreminder/com.people.rock.ReminderEditActivity}: java.lang.NullPointerException 
07-16 08:11:32.715: E/AndroidRuntime(945): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 
07-16 08:11:32.715: E/AndroidRuntime(945): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
07-16 08:11:32.715: E/AndroidRuntime(945): at android.app.ActivityThread.access$800(ActivityThread.java:135) 
07-16 08:11:32.715: E/AndroidRuntime(945): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
07-16 08:11:32.715: E/AndroidRuntime(945): at android.os.Handler.dispatchMessage(Handler.java:102) 
07-16 08:11:32.715: E/AndroidRuntime(945): at android.os.Looper.loop(Looper.java:136) 
07-16 08:11:32.715: E/AndroidRuntime(945): at android.app.ActivityThread.main(ActivityThread.java:5017) 
07-16 08:11:32.715: E/AndroidRuntime(945): at java.lang.reflect.Method.invokeNative(Native Method) 
07-16 08:11:32.715: E/AndroidRuntime(945): at java.lang.reflect.Method.invoke(Method.java:515) 
07-16 08:11:32.715: E/AndroidRuntime(945): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
07-16 08:11:32.715: E/AndroidRuntime(945): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
07-16 08:11:32.715: E/AndroidRuntime(945): at dalvik.system.NativeStart.main(Native Method) 
07-16 08:11:32.715: E/AndroidRuntime(945): Caused by: java.lang.NullPointerException 
07-16 08:11:32.715: E/AndroidRuntime(945): at com.people.rock.ReminderEditActivity.registerButtonListnerAndSetDefaultText(ReminderEditActivity.java:121) 
07-16 08:11:32.715: E/AndroidRuntime(945): at com.people.rock.ReminderEditActivity.onCreate(ReminderEditActivity.java:47) 
07-16 08:11:32.715: E/AndroidRuntime(945): at android.app.Activity.performCreate(Activity.java:5231) 
07-16 08:11:32.715: E/AndroidRuntime(945): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
07-16 08:11:32.715: E/AndroidRuntime(945): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
07-16 08:11:32.715: E/AndroidRuntime(945): ... 11 more 
07-16 08:11:36.505: I/Process(945): Sending signal. PID: 945 SIG: 9 

由于错误

+0

删除'的setContentView(R.layout.reminder_list);' –

+0

交'reminder_edit.xml' – Raghunandan

回答

1

您正在使用按钮收听器mConfirmButton,mDateButton,mTimeButton)in registerButtonListnerAndSetDefaultText() function befo重新初始化。

初始化按钮后,那么调用registerButtonListnerAndSetDefaultText()作为

 mDbHelper = new RemindersDbAdapter(this); 
    mDateButton=(Button) findViewById(R.id.reminder_date); 
    mTimeButton=(Button) findViewById(R.id.reminder_time); 
    mCalendar = Calendar.getInstance(); 
    mConfirmButton = (Button) findViewById(R.id.confirm); 
    mTitleText = (EditText) findViewById(R.id.title); 
    mBodyText = (EditText) findViewById(R.id.body); 

    registerButtonListnerAndSetDefaultText(); // use here 
0

你的失败是你,你通过ID找到按钮mConfirmButton之前调用registerButtonListnerAndSetDefaultText();)

0

初始化mConfirmButton之前要调用registerButtonListnerAndSetDefaultText();所以它给人的NullPointerException。

相关问题