Вопрос о передаче данных с использованием намерений - PullRequest
2 голосов
/ 19 апреля 2010

Я пытаюсь изменить учебник Notepad (решение Notepadv3) так, чтобы он принимал значение в классе NoteEdit, заданном классом Notepadv3. Я успешно использовал .putExtra в методе OnListItemClick для помещения значения в класс NoteEdit, но я изо всех сил пытаюсь сделать это для метода createNote; Когда я пытаюсь создать новую заметку, у меня приближается сила.

Могу поспорить, что есть простое решение, но я довольно новичок в Java и Android и буду очень признателен за вашу помощь.

Вот код в классе Notepadv3:

private void createNote() {
    Intent i = new Intent(this, NoteEdit.class);
    i.putExtra("key", 1);
    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);
    i.putExtra("key", 1);
    startActivityForResult(i, ACTIVITY_EDIT);
}

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

А вот код получения в классе NoteEdit:

mRowId = savedInstanceState != null ? savedInstanceState.getLong(NotesDbAdapter.KEY_ROWID) 
                                        : null;
    if (mRowId == null) {
        Bundle extras = getIntent().getExtras();            
        mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID) 
                                : null;
                    value = extras.getInt("key");

    }

Я вполне уверен, что (mRowId == null) неверно, когда я использую метод createNote, поэтому getExtras вызываться не будет. Один из моих вопросов - как я могу заставить мой класс NoteEdit получить это значение, когда я использую метод createNote? Я новичок в этом, так что извините, если это простой вопрос для всех вас.

Спасибо

Джо

Ответы [ 2 ]

1 голос
/ 21 октября 2011

При использовании Intent для запуска другого действия принимающее действие должно использовать метод getIntent() для доступа к нему; нет никаких оснований использовать savedInstanceState для этой цели; это полезно только при «восстановлении» текущего состояния действия, потому что оно было прервано.

Вы можете использовать "дополнительные функции" Intent в операции отправки для передачи данных, которые вы хотите отправить. Операция получения использует те же дополнительные имена для доступа к данным. Кроме того, никогда не предполагайте, что все дополнительные материалы были отправлены (т. Е. Проверьте на null s!)

Вы должны принять все решения относительно действия действия в методе onCreate принимающего действия.

Если действие можно «запустить» несколькими способами, вы должны использовать Intent.setAction() в Intent и проверять все действительные действия в получающем действии.

Кроме того, не зависит от параметра id в onListItemClick, это часто неверно. Параметр position всегда корректен, и вы можете использовать его, чтобы получить актуальный элемент из адаптера и получить идентификатор элемента. Обычно вместо URI отправляется идентификатор URI для данных Intent; это лучше работает с разрешением активности системы (см. ниже).

На самом деле действия «манипулирования данными» должны поддерживать стандартные действия для редактирования данных INSERT, EDIT и т. П. И иметь фильтры намерений, которые определяют эти действия и тип MIME ваших данных. Я уверен, что они являются частью примера приложения.

В операции получения вы должны позвонить Activity.setResult(), и вы обычно отправляете обратно данные о возврате (например, URL нового контента) через другой Intent, к которому вы затем получаете доступ из операции отправки в onActivityResult(). Кроме того, вы должны позвонить setResult() в соответствующее время; например Вызов его во время выхода из жизненного цикла (onPause() или onStop()) слишком поздний, и ваши результаты не будут переданы обратно.

0 голосов
/ 21 января 2012
if (mRowId == null) {
    Bundle extras = getIntent().getExtras();            
    mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID) 
                            : null;
    if (mRowId == 0) mRowId = null;

    value = extras.getInt("key");

}

Изменить код следующим образом. Проблема в том, что вызов createNote создает новую заметку с mRowId как ноль. Однако, поскольку вы передаете аргумент «ключ», дополнительные функции не будут иметь значение null, но при этом они не будут иметь значения для KEY_ROWID, а getLong () возвращает 0 по умолчанию. Проблема возникает позже, когда вы запрашиваете _id = 0 в populateFields ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...