Question

I have completed Notepad tutorial v3 but one thing i can't figure out how to make my notes to open in view mode not the edit mode.

I've made my own notepad with button and stuff but still can't view them.. Helper class

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;
}

}

main class

public class Notepadv3 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;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.notes_list);
    mDbHelper = new NotesDbAdapter(this);
    mDbHelper.open();
    fillData();
    registerForContextMenu(getListView());
}

private void fillData() {
    Cursor notesCursor = mDbHelper.fetchAllNotes();
    startManagingCursor(notesCursor);

    // 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, notesCursor, 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() {
    Intent i = new Intent(this, NoteEdit.class);
    startActivityForResult(i, ACTIVITY_CREATE);
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    Intent i = new Intent(this, NoteEdit.class);
    i.putExtra(NotesDbAdapter.KEY_ROWID, id);
    startActivityForResult(i, ACTIVITY_EDIT);
}

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

}

Was it helpful?

Solution

You can create a new activity. Copy and modify stuffs from the NoteEdit class if you want to make it quick and dirty. If you have time, you should spend some time think about design and follow DRY as Code-Guru suggests "Copy and paste coding is a poor design".

public class NoteView extends Activity {
private NotesDbAdapter mDbHelper;
private TextView mTitleText;
private TextView mBodyText;
private Long mRowId;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mDbHelper = new NotesDbAdapter(this);
    mDbHelper.open();
    setContentView(R.layout.note_view);
    setTitle(R.string.edit_note);
    mTitleText = (TextView) findViewById(R.id.title);
    mBodyText = (TextView) findViewById(R.id.body);
    mRowId = (savedInstanceState == null) ? null
            : (Long) savedInstanceState
                    .getSerializable(NotesDbAdapter.KEY_ROWID);
    if (mRowId == null) {
        Bundle extras = getIntent().getExtras();
        mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID)
                : null;
    }
    populateFields();
}
private void populateFields() {
    if (mRowId != null) {
        Log.v("NoteView", "id "+ mRowId);
        Cursor note = mDbHelper.fetchNote(mRowId);
        //startManagingCursor(note);
        mTitleText.setText(note.getString(note
                .getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
        mBodyText.setText(note.getString(note
                .getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
    }
}
}

Find a button or somewhere that you can trigger that activity.

public void onClick(View v) {
Intent i = new Intent(mCtx, NoteView.class);
    i.putExtra(NotesDbAdapter.KEY_ROWID, id);
    mCtx.startActivity(i);
}

OTHER TIPS

As you may know, you can send data to an Activity by using "extras" in an Intent. To determine whether the data is in "view" mode or "edit" mode, simply send a boolean value to indicate which it is. Then the receiving Activity can check the boolean "extra" and disable or enable all editable views based on that flag.

Notepad Apps ## https://play.google.com/store/apps/details?id=com.FreeNotePad.Notes[Free Notepad is the simple, elegant, easy way to keep notes on your smart phone.

Once upon a time, you have to write down notes in a paper notepad.]2

public class FontTypePreference extends DialogPreference {
private List<String> fonts = null;
private int selected;

public FontTypePreference(Context context, AttributeSet attrs) {
    super(context, attrs);

    SharedPreferences sharedPref = PreferenceManager
            .getDefaultSharedPreferences(getContext());
    String font = sharedPref.getString("font", "Monospace");

    if (font.equals("Serif"))
        selected = 1;
    else if (font.equals("Sans Serif"))
        selected = 2;
    else
        selected = 0;
}

protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
    // Data has changed, notify so UI can be refreshed!
    builder.setTitle("Choose a font type");
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {

            Editor editor = PreferenceManager.getDefaultSharedPreferences(
                    getContext()).edit();

            if (selected == 0)
                editor.putString("font", "Monospace");
            else if (selected == 1)
                editor.putString("font", "Serif");
            else
                editor.putString("font", "Sans Serif");

            editor.commit();

            notifyChanged();
        }
    });
    builder.setNegativeButton("Cancel",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    // do nothing on a cancel
                }
            });

    // load the font names
    String[] arrayOfFonts = { "Monospace", "Serif", "Sans Serif" };
    fonts = Arrays.asList(arrayOfFonts);

    FontTypeArrayAdapter adapter = new FontTypeArrayAdapter(getContext(),
            android.R.layout.simple_list_item_single_choice, fonts);
    builder.setSingleChoiceItems(adapter, selected,
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                    selected = which;
                }
            });
} 

public class FontTypeArrayAdapter extends ArrayAdapter<String> {
    public FontTypeArrayAdapter(Context context, int resource,
            List<String> objects) {
        super(context, resource, objects);

    }

    public View getView(int position, View convertView, ViewGroup parent) {

        View v = super.getView(position, convertView, parent);
        final TextView tv = (TextView) v;

        final String option = tv.getText().toString();
        if (option.equals("Serif"))
            tv.setTypeface(Typeface.SERIF);
        else if (option.equals("Sans Serif"))
            tv.setTypeface(Typeface.SANS_SERIF);
        else if (option.equals("Monospace"))
            tv.setTypeface(Typeface.MONOSPACE);

        tv.setTextColor(Color.BLACK);
        tv.setPadding(10, 3, 3, 3);

        return v;
    }

}

}

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top