0

在这个应用程序中,我正在尝试使用警报对话框填充列表视图。基本上,当您单击“添加新”时,应该会弹出一个警报对话框,您可以在其中输入一些文本。当您单击确认时,假设将用户在警报对话框中键入的任何文本添加到列表视图中。我为此使用了 Google 的示例记事本教程应用程序并尝试自己更改代码,但是当我在警报对话框上单击确认时,我收到此错误:

06-08 16:54:47.516:E/AndroidRuntime(2509):致命异常:主要 06-08 16:54:47.516:E/AndroidRuntime(2509):java.lang.NullPointerException 06-08 16:54:47.516: E/AndroidRuntime(2509):在 com.android.demo.notepad2.Notepadv2$1.onClick(Notepadv2.java:146) 06-08 16:54:47.516:E/AndroidRuntime(2509):在 com.android.internal。 app.AlertController$ButtonHandler.handleMessage(AlertController.java:185) 06-08 16:54:47.516: E/AndroidRuntime(2509): 在 android.os.Handler.dispatchMessage(Handler.java:99) 06-08 16: 54:47.516: E/AndroidRuntime(2509): 在 android.os.Looper.loop(Looper.java:137) 06-08 16:54:47.516: E/AndroidRuntime(2509): 在 android.app.ActivityThread.main (ActivityThread.java:5293) 06-08 16:54:47.516: E/AndroidRuntime(2509): at java.lang.reflect.Method.invokeNative(Native Method) 06-08 16:54:47.516: E/AndroidRuntime( 2509):在 java.lang.reflect.Method.invoke(Method.java:511) 06-08 16:54:47.516: E/AndroidRuntime(2509): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit. java:1102) 06-08 16:54:47.516: E/AndroidRuntime(2509): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 06-08 16:54:47.516: E/ AndroidRuntime(2509): 在 dalvik.system.NativeStart.main(Native Method)

Notepadv2.java

public class Notepadv2 extends ListActivity {
    private static final int ACTIVITY_CREATE=0;
    private static final int ACTIVITY_EDIT=1;

    private static final int INSERT_ID = Menu.FIRST;
    private static final int DELETE_ID = Menu.FIRST + 1;

    private NotesDbAdapter mDbHelper;
    private Cursor mNotesCursor;
    private EditText mTitleText;
    private EditText mBodyText;
    private Long mRowId;

    /** Called when the activity is first created. */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.notes_list);

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

        mRowId = null;
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            String title = extras.getString(NotesDbAdapter.KEY_TITLE);
            String body = extras.getString(NotesDbAdapter.KEY_BODY);
            mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);

            if (title != null) {
                mTitleText.setText(title);
            }
            if (body != null) {
                mBodyText.setText(body);
            }
        }
    }

    private void fillData() {
        // Get all of the rows from the database and create the item list
        mNotesCursor = mDbHelper.fetchAllNotes();
        startManagingCursor(mNotesCursor);

        // Create an array to specify the fields we want to display in the list (only TITLE)
        String[] from = new String[]{NotesDbAdapter.KEY_TITLE};

        // and an array of the fields we want to bind those fields to (in this case just text1)
        int[] to = new int[]{R.id.text1};

        // Now create a simple cursor adapter and set it to display
        SimpleCursorAdapter notes = 
            new SimpleCursorAdapter(this, R.layout.notes_row, mNotesCursor, from, to);
        setListAdapter(notes);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        menu.add(0, INSERT_ID, 0, R.string.menu_insert);
        return true;
    }

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        switch(item.getItemId()) {
            case INSERT_ID:
                createNote();
                return true;
        }

        return super.onMenuItemSelected(featureId, item);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0, DELETE_ID, 0, R.string.menu_delete);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case DELETE_ID:
                AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
                mDbHelper.deleteNote(info.id);
                fillData();
                return true;
        }
        return super.onContextItemSelected(item);
    }

    private void createNote()
    {
           Context context = Notepadv2.this;
           AlertDialog.Builder alert = new AlertDialog.Builder(context);

            alert.setTitle("Add note");
            alert.setMessage("Enter text here");

             // Set an EditText view to get user input   
              final EditText input = new EditText(this); 
              alert.setView(input);

              alert.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int whichButton) {

                      Bundle bundle = new Bundle();

                      bundle.putString(NotesDbAdapter.KEY_TITLE, mTitleText.getText().toString());
                      bundle.putString(NotesDbAdapter.KEY_BODY, mBodyText.getText().toString());
                      if (mRowId != null) {
                          bundle.putLong(NotesDbAdapter.KEY_ROWID, mRowId);
                      }

                      Intent mIntent = new Intent();
                      mIntent.putExtras(bundle);
                      setResult(RESULT_OK, mIntent);
                  }

              });

              alert.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int whichButton) {

                      /* User clicked Cancel so do some stuff */
                  }
              });

            alert.create();
            alert.show();
    }


    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Cursor c = mNotesCursor;
        c.moveToPosition(position);
        Bundle bundle = new Bundle();

        bundle.putString(NotesDbAdapter.KEY_TITLE, mTitleText.getText().toString());
        bundle.putString(NotesDbAdapter.KEY_BODY, mBodyText.getText().toString());
        if (mRowId != null) {
            bundle.putLong(NotesDbAdapter.KEY_ROWID, mRowId);
        }

        Intent mIntent = new Intent();
        mIntent.putExtras(bundle);
        setResult(RESULT_OK, mIntent);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        Bundle extras = intent.getExtras();
        switch(requestCode) {
            case ACTIVITY_CREATE:
                String title = extras.getString(NotesDbAdapter.KEY_TITLE);
                String body = extras.getString(NotesDbAdapter.KEY_BODY);
                mDbHelper.createNote(title, body);
                fillData();
                break;
            case ACTIVITY_EDIT:
                Long rowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
                if (rowId != null) {
                    String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);
                    String editBody = extras.getString(NotesDbAdapter.KEY_BODY);
                    mDbHelper.updateNote(rowId, editTitle, editBody);
                }
                fillData();
                break;
        }
    }
}

NotesDbAdapter.java

public class NotesDbAdapter {

    public static final String KEY_TITLE = "title";
    public static final String KEY_BODY = "body";
    public static final String KEY_ROWID = "_id";

    private static final String TAG = "NotesDbAdapter";
    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;

    /**
     * Database creation sql statement
     */
    private static final String DATABASE_CREATE =
        "create table notes (_id integer primary key autoincrement, "
        + "title text not null, body text not null);";

    private static final String DATABASE_NAME = "data";
    private static final String DATABASE_TABLE = "notes";
    private static final int DATABASE_VERSION = 2;

    private final Context mCtx;

    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

            db.execSQL(DATABASE_CREATE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS notes");
            onCreate(db);
        }
    }

    /**
     * Constructor - takes the context to allow the database to be
     * opened/created
     * 
     * @param ctx the Context within which to work
     */
    public NotesDbAdapter(Context ctx) {
        this.mCtx = ctx;
    }

    /**
     * Open the notes database. If it cannot be opened, try to create a new
     * instance of the database. If it cannot be created, throw an exception to
     * signal the failure
     * 
     * @return this (self reference, allowing this to be chained in an
     *         initialization call)
     * @throws SQLException if the database could be neither opened or created
     */
    public NotesDbAdapter open() throws SQLException {
        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        mDbHelper.close();
    }


    /**
     * Create a new note using the title and body provided. If the note is
     * successfully created return the new rowId for that note, otherwise return
     * a -1 to indicate failure.
     * 
     * @param title the title of the note
     * @param body the body of the note
     * @return rowId or -1 if failed
     */
    public long createNote(String title, String body) {
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_TITLE, title);
        initialValues.put(KEY_BODY, body);

        return mDb.insert(DATABASE_TABLE, null, initialValues);
    }

    /**
     * Delete the note with the given rowId
     * 
     * @param rowId id of note to delete
     * @return true if deleted, false otherwise
     */
    public boolean deleteNote(long rowId) {

        return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
    }

    /**
     * Return a Cursor over the list of all notes in the database
     * 
     * @return Cursor over all notes
     */
    public Cursor fetchAllNotes() {

        return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE,
                KEY_BODY}, null, null, null, null, null);
    }

    /**
     * Return a Cursor positioned at the note that matches the given rowId
     * 
     * @param rowId id of note to retrieve
     * @return Cursor positioned to matching note, if found
     * @throws SQLException if note could not be found/retrieved
     */
    public Cursor fetchNote(long rowId) throws SQLException {

        Cursor mCursor =

            mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
                    KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
                    null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;

    }

    /**
     * Update the note using the details provided. The note to be updated is
     * specified using the rowId, and it is altered to use the title and body
     * values passed in
     * 
     * @param rowId id of note to update
     * @param title value to set note title to
     * @param body value to set note body to
     * @return true if the note was successfully updated, false otherwise
     */
    public boolean updateNote(long rowId, String title, String body) {
        ContentValues args = new ContentValues();
        args.put(KEY_TITLE, title);
        args.put(KEY_BODY, body);

        return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
    }
}

notes_row.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView android:id="@+id/text1" xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="12dp"/>

notes_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    <ListView android:id="@+id/android:list"
          android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    <TextView android:id="@+id/android:empty"
          android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/no_notes"/>
</LinearLayout>

有没有人有任何示例代码我可以用上面的代码替换以阻止此错误的发生?谢谢!

4

1 回答 1

0
    setContentView(R.layout.notes_list);

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

我在您的 xml 中没有看到任何带有 idtitlebody.

未找到任何视图,因此您在此处获得 NPE:

    bundle.putString(NotesDbAdapter.KEY_TITLE, mTitleText.getText().toString());
    bundle.putString(NotesDbAdapter.KEY_BODY, mBodyText.getText().toString());
于 2013-06-09T01:32:19.747 回答