2012-03-31 2 views
0

У меня есть пользовательский диалог с одним видом редактирования и двумя кнопками в порядке и отмена. У меня есть представление пользовательского списка, отображающее некоторые строки данных, извлеченных из базы данных. Когда пользователь нажимает на строку списка, пользовательское диалоговое окно отображается пользователю для редактирования выбранной строки. То, что я хочу сделать, - это передать объект, привязанный к выбранной строке, в диалоговое окно, чтобы я мог отображать редактируемые данные.Как передать переменную или объект в диалоговом окне в android

Вот мой класс активности:

public class TestDatabaseActivity extends ListActivity { 
private CommentsDataSource datasource; 
private CommentAdapter adt; 

static final int CUSTOM_DIALOG_ID = 0; 
private TextView dialog_editComment; 
private EditText dialog_txtEditComment; 
private Button dialog_btnOk, dialog_btnCancel; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    datasource = new CommentsDataSource(TestDatabaseActivity.this); 
    datasource.open(); 
    getList(); 
} 
private void getList() 
{ 
    List<Comment> values = datasource.getAllComments(); 
    adt=new CommentAdapter(TestDatabaseActivity.this,R.layout.comment_row,values); 
    setListAdapter(adt);  
} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    CommentAdapter adapter= (CommentAdapter) getListAdapter(); 
    final Comment cmt = adapter.mListComment.get(position); 
    System.out.println(cmt.getId()+cmt.getComment()); 

      //cmt is the object which i want to pass to my dialog 
    showDialog(CUSTOM_DIALOG_ID); 

} 

    private Button.OnClickListener customDialog_UpdateOnClickListener = new Button.OnClickListener(){ 

@Override 
public void onClick(View arg0) { 
    // TODO Auto-generated method stub 
    //save the value and update list 
} 

    }; 

    private Button.OnClickListener customDialog_DismissOnClickListener 
    = new Button.OnClickListener(){ 

@Override 
public void onClick(View arg0) { 
    // TODO Auto-generated method stub 
    dismissDialog(CUSTOM_DIALOG_ID); 
} 

    }; 

@Override 
protected Dialog onCreateDialog(int id) { 
// TODO Auto-generated method stub 
Dialog dialog = null;; 
    switch(id) { 
    case CUSTOM_DIALOG_ID: 
    dialog = new Dialog(TestDatabaseActivity.this); 

    dialog.setContentView(R.layout.comment_edit_dialog); 
    dialog.setTitle("Edit"); 

    dialog_editComment = (TextView)dialog.findViewById(R.id.editComment); 
    dialog_txtEditComment = (EditText)dialog.findViewById(R.id.txtComment); 
    dialog_btnOk = (Button)dialog.findViewById(R.id.btnOk); 
    dialog_btnCancel = (Button)dialog.findViewById(R.id.btnCancel); 

    dialog_btnOk.setOnClickListener(customDialog_UpdateOnClickListener); 
    dialog_btnCancel.setOnClickListener(customDialog_DismissOnClickListener); 
    break; 
    } 
    return dialog; 
} 
} 

ответ

1

Вместо того, чтобы использовать ShowDialog (CUSTOM_DIALOG_ID) использовать вы можете создать свой собственный метод с аргументом и в том, что вы можете использовать AlertDialog для отображения представления, содержащее TextView кнопки и ,

i) private AlertDialog alert; should be declared in class scope above oncreate(). 

б) Вместо ShowDialog (CUSTOM_DIALOG_ID) использовать CreateDialog (СМТ)

iii) private void createDialog(Comment cmt){ 
     AlertDialog.Builder dialog = new AlertDialog.Builder(TestDatabaseActivity.this); 
     View view = _inflater.inflate(R.layout.comment_edit_dialog,null); 
     dialog.setTitle("Edit"); 

     dialog_editComment = (TextView)view .findViewById(R.id.editComment); 
     dialog_txtEditComment = (EditText)dialog.findViewById(R.id.txtComment); 
     dialog_btnOk = (Button)view .findViewById(R.id.btnOk); 
     dialog_btnCancel = (Button)view .findViewById(R.id.btnCancel); 

     dialog_btnOk.setOnClickListener(customDialog_UpdateOnClickListener); 
     dialog_btnCancel.setOnClickListener(customDialog_DismissOnClickListener); 
     dialog.setView(view); 
     //dialog.show(); 
     alert = dialog.create(); 
     alert.show(); 
    } 

IV) также вместо dismissDialog (CUSTOM_DIALOG_ID) использовать alert.dismiss();

+0

могли бы вы дать мне пример того, как сделать так – rockstar

+0

я попробовал это, но в строке dialog_editComment = (TextView) dialog.findViewById (R.id.editComment); Я получаю сообщение об ошибке, как метод findViewById не определен для типа AlertDialog.Builder – rockstar

+0

, пожалуйста, перепроверьте теперь замененный диалог с представлением в нескольких плагинах. – Ishu

0
Also another solution to your problem is change the scope of cmt. 

i.e., Above onCreate() declare 

private Comment cmt; 

now it can be access the TestDatabaseActivity. in your code make a minor change and try 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    CommentAdapter adapter= (CommentAdapter) getListAdapter(); 
    cmt = adapter.mListComment.get(position); 
    System.out.println(cmt.getId()+cmt.getComment()); 

      //cmt is the object which i want to pass to my dialog 
    showDialog(CUSTOM_DIALOG_ID); 
} 

also declare private Comment cmt = null; above oncreate() and then in onCreateDialog() you can access 

System.out.println(cmt.getId()+cmt.getComment()); 

Try ..... 
+0

, поэтому я могу получить к нему доступ из метода onCreate диалога, но проблема в том, что я получаю то же значение в диалоговом окне – rockstar

+0

. Я не получил вас, вы можете быть более конкретным, чтобы получить то же значение, что и значение – Ishu

+0

нажав на любую строку в списке, я получаю тот же самый объект cmt, т. е. im, отображающий cmt.comment внутри диалогового окна, поэтому нажатие на любую строку i получает одинаковое значение cmt.comment – rockstar

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