2011-02-09 2 views
0

Я работаю и приложение основано на учебнике Notepad ... В учебнике вы нажмете на заметку в списке, и вы сделаете так, чтобы была отредактирована соответствующая информация, тогда вы сделайте свои изменения, выберите confirm..and вернитесь в Main.Нужна помощь с onClick и намерениями

Добавил вторую активность в приложение «contact» теперь, когда вы нажимаете на заметку в списке, и вы попадаете в контакт, отображается соответствующая информация, включая кнопку .......... .. вы нажимаете кнопку и снимаетесь, чтобы редактировать ......... И это была моя проблема, вызывающая его уродливую голову. Когда я нажимаю кнопку, получаю пустой экран и принудительное закрытие всплывающего окна ........

Вот код основного сообщения, в котором вы должны связаться .... Это работает информация отображается

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

Вот код, который доставит вас от контакта для редактирования ..... Это дает мне ошибку, я уверен, что это связано с «intent.putExtra (NotesDbAdapter.KEY_ROWID, id);» необходимости перекодировать для работы с OnClick по сравнению с onListitemClick ........ Я думаю, идентификатор не передается через

public void onClick(View v) { 
String id = null; 
switch (v.getId()) { 
case R.id.admin: // doStuff 
    Intent intent = new Intent(this, Contact.class); 
    intent.putExtra(NotesDbAdapter.KEY_ROWID, id); 
    startActivity(intent); 
    break; 

Может кто-то показать мне, как сделать это с помощью кнопки ????

Вот код из Main, Контакты и Edit .......... Если вам это нужно ....... Спасибо

Main.class

public class Main 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 static final int ABOUT = Menu.FIRST + 2; 
private static final int TESTBUTTON = Menu.FIRST + 3; 
private static final int CONTACT_ID = Menu.FIRST + 4; 
private static final int CANCEL_ID = Menu.FIRST + 5; 

private NotesDbAdapter mDbHelper; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    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_NAME, NotesDbAdapter.KEY_RANK}; 


    // 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, R.id.text2}; 

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

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

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    switch(item.getItemId()) { 
     case INSERT_ID: 
      createNote(); 
      return true; 
     case ABOUT:   
      menuabout();   
      return true; 
     case TESTBUTTON:   
      menutest();   
      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, CONTACT_ID, 0, R.string.menu_contact); 
    menu.add(0, DELETE_ID, 0, R.string.menu_delete); 
    menu.add(0, CANCEL_ID, 0, R.string.menu_cancel); 

} 

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

private void menutest() { 
    Intent i = new Intent(this, Newmain.class); 
    startActivityForResult(i, ACTIVITY_CREATE); 
    Log.i(this.toString(), "menu test"); 
} 

private void contact() { 
    Intent i = new Intent(this, Contact.class); 
    startActivityForResult(i, ACTIVITY_CREATE); 
    Log.i(this.toString(), "menu contact"); 
}  

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

public void menuabout() { 
    final Dialog dialog = new Dialog(Main.this); 
    dialog.setContentView(R.layout.about); 
    dialog.setTitle("About NCO Leaders Book");  
    dialog.setCancelable(true); 
    Button button = (Button) dialog.findViewById(R.id.AboutButton); 
    button.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     dialog.dismiss(); 
    } 
       }); 
       //now that the dialog is set up, it's time to show it  
       dialog.show(); 
} 


@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    Intent i = new Intent(this, Contact.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(); 
} 

}

Contact.class

public class Contact extends Activity implements OnClickListener{  
    private EditText mNameText; 
    private EditText mRankText; 
    private Long mRowId; 
    private NotesDbAdapter mDbHelper; 
    protected Cursor cursor; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mDbHelper = new NotesDbAdapter(this); 
     mDbHelper.open(); 
     setContentView(R.layout.contact); 

     Button adminButton = (Button) this.findViewById(R.id.admin); 
     adminButton.setOnClickListener(this); 

     mNameText = (EditText) findViewById(R.id.name); 
     mRankText = (EditText) findViewById(R.id.rank); 

     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) { 
     Cursor note = mDbHelper.fetchsoldiers(mRowId); 
     startManagingCursor(note); 
     mNameText.setText(note.getString(
       note.getColumnIndexOrThrow(NotesDbAdapter.KEY_NAME))); 
     mRankText.setText(note.getString(
       note.getColumnIndexOrThrow(NotesDbAdapter.KEY_RANK))); 
    } 
} 

//@Override 
public void onClick(View v) { 
    String id = null; 
    switch (v.getId()) { 
    case R.id.admin: // doStuff 
     Intent intent = new Intent(this, Edit.class); 
     intent.putExtra(NotesDbAdapter.KEY_ROWID, id); 
     startActivity(intent); 
     Log.i("Onclick", "EndingTestNext");  
     break; 
}} 

} 

Edit.class

public class Edit extends Activity { 

private EditText mNameText; 
private EditText mRankText; 
private EditText mSsnText; 
private Long mRowId; 
private NotesDbAdapter mDbHelper; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mDbHelper = new NotesDbAdapter(this); 
    mDbHelper.open(); 

    setContentView(R.layout.edit); 
    setTitle(R.string.edit_note); 

    mNameText = (EditText) findViewById(R.id.name); 
    mRankText = (EditText) findViewById(R.id.rank); 
    mSsnText = (EditText) findViewById(R.id.ssn); 

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


    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(); 

    confirmButton.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View view) { 
      setResult(RESULT_OK); 
      finish(); 
     } 

    }); 
} 

private void populateFields() { 
    if (mRowId != null) { 
     Cursor note = mDbHelper.fetchNote(mRowId); 
     startManagingCursor(note); 
     mNameText.setText(note.getString(
       note.getColumnIndexOrThrow(NotesDbAdapter.KEY_NAME))); 
     mRankText.setText(note.getString(
       note.getColumnIndexOrThrow(NotesDbAdapter.KEY_RANK))); 
     mSsnText.setText(note.getString(
       note.getColumnIndexOrThrow(NotesDbAdapter.KEY_SSN))); 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    saveState(); 
    outState.putSerializable(NotesDbAdapter.KEY_ROWID, mRowId); 
} 

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

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

private void saveState() { 
    String name = mNameText.getText().toString(); 
    String rank = mRankText.getText().toString(); 
    String ssn = mSsnText.getText().toString(); 

    if (mRowId == null) { 
     long id = mDbHelper.createNote(name, rank, ssn); 
     if (id > 0) { 
      mRowId = id; 
     } 
    } else { 
     mDbHelper.updateNote(mRowId, name, rank, ssn); 
    } 
}} 

ответ

0

Вот что я думаю, что происходит. Класс Contact предполагает, что намерение, которое запускает его, должно иметь длинный дополнительный ключ KEY_ROWID. В методе onClick вы устанавливаете нулевое значение String. Когда Contact.onCreate пытается получить его, он получает явное значение строки String, которое не может быть назначено переменной Long mRowId. Просто не вызывайте putExtra, так как на самом деле у вас нет данных для передачи.

+0

Мне кажется, ему все еще нужно вызвать putExtra с помощью строки, которую он просматривает в окне «Контакты», поэтому он может отредактируйте его в задании Изменить. –

+0

Скорее всего, это то, что хочет OP. Однако не стоит не вызывать putExtra. Нулевой (или отсутствующий) rowid создает новое примечание. (См. 'Edit.saveState()'.) Дело в том, что ** не ** делать это, чтобы хранить объект String (нуль или иначе) в KEY_ROWID. –

+0

Ted Hopp - Правильно, я не хочу передавать данные в класс редактирования, мне нужно перейти в класс редактирования и показать записи от человека, указанного в классе контактов. –

0

В первом коде, который работает, id in onListItemClick() - это числовой идентификатор строки, который используется в вашей базе данных как KEY_ROWID. Вот почему он передается как дополнительные данные. При переключении на использование кнопки и OnClick() код кнопки имеет только представление (контакта), а не редактируемое значение rowid. Поэтому вы хотите, чтобы вы каким-то образом передали идентификатор строки в намерение «Контакт», так что кнопка «OnClick»() может передать этот rowid в класс Edit как значение id. Вы не можете просто установить его равным нулю, как и вы. Это действительно должен быть идентификатор строки из базы данных, которую вы просматриваете, поэтому ваша кнопка может вызвать класс редактирования

+0

codeboy2k - Я согласен «передать идентификатор строки в намерение контакта как-то», это та часть, которая меня заводит орехами КАК? –

+0

Похоже, ваш основной класс onListItemClick() уже отправляет rowid в класс Contact. Вам просто нужно извлечь этот rowid из Intent, который запустил активность Contact, и передать его в действие Edit, запустив Edit. В кнопке onClick() класса Contact используйте this.getIntent(), чтобы получить намерение, которое начало действие контакта. Затем используйте getExtras(), чтобы получить карту (тип пакета) для извлечения исходной строки. Поместите этот rowid в новое намерение, используемое для запуска вашего действия Edit. –

+0

codeboy2k = Вы говорите об использовании чего-то подобного Bundle extras = getIntent(). GetExtras(); –

Смежные вопросы