2015-06-21 3 views
0

У меня возникают проблемы с получением данных из моего диалога в вызывающую активность. Следовал за андроидными документами, но не повезло. Я просто хочу записать строку, которую кто-то вводит в текстовое поле редактирования моего диалога. Вот моя настройка.Android передает аргументы из диалога в вызывающую активность

public class CrossoverMainActivity extends Activity implements CrossoverSaveDialog.NoticeDialogListener { 

final CrossoverSaveDialog dialog_save = new CrossoverSaveDialog(); 


    @Override 
    public void onDialogPositiveClick(DialogFragment dialog) { 
     // User touched the dialog's positive button 

    } 

    @Override 
    public void onDialogNegativeClick(DialogFragment dialog) { 
     // User touched the dialog's negative button 

    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     if (id == R.id.action_save) { 

      dialog_save.show(getFragmentManager(), "Dialog_save"); 
      return true; 
     } 
     if (id == R.id.action_delete) { 
      CrossoverDeleteDialog dialog_delete = new CrossoverDeleteDialog(); 
      //Fragment fragment = new Fragment(); 
      dialog_delete.show(getFragmentManager(), "Dialog_delete"); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

Затем, в другом файле .java, у меня есть диалог:

public class CrossoverSaveDialog extends DialogFragment { 

    public interface NoticeDialogListener { 
     void onDialogPositiveClick(DialogFragment dialog); 
     void onDialogNegativeClick(DialogFragment dialog); 
    } 

    // Use this instance of the interface to deliver action events 
    NoticeDialogListener mListener; 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     View dialogSave = inflater.inflate(R.layout.crossover_save_dialog, null); 

     builder.setView(dialogSave); 

     builder.setPositiveButton(R.string.dialog_save, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         mListener.onDialogPositiveClick(CrossoverSaveDialog.this); 
        } 
       }) 
       .setNegativeButton(R.string.dialog_cancel, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int id) { 
         mListener.onDialogNegativeClick(CrossoverSaveDialog.this); 
        } 
       }); 

     return builder.create(); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     // Verify that the host activity implements the callback interface 
     try { 
      // Instantiate the NoticeDialogListener so we can send events to the host 
      mListener = (NoticeDialogListener) activity; 
     } catch (ClassCastException e) { 

      // The activity doesn't implement the interface, throw exception 
      throw new ClassCastException(activity.toString() 
        + " must implement NoticeDialogListener"); 
     } 
    } 
} 

Вот мои два вопроса:

  • Проблема я получаю то, что компилятор жалуется, что я не внедряю методы моего интерфейса ... которые я, кажется, есть. Здесь что-то не хватает?

  • Я должен сделать это для второго диалога, который отличается от того, который я здесь показал. Но я буду делать это таким же образом. Я просто смотрю в диалоговом окне метода обратного вызова, чтобы определить, какой диалог используется? Таким образом, я могу обрабатывать свою логику для каждого диалога. Или, должен ли я иметь каждый диалог с отдельным интерфейсом, который использует его каждый уникальный метод, и просто реализовать каждый из них?

ответ

0

Я на самом деле понял ответ здесь.

@blender: Может быть, я неправильно понимаю это, но я не думаю, что мне нужно сделать это правильно? Я имею в виду, что я реализую интерфейс уже в своем классе активности, и я привязываюсь к нему через onAttach в своем классе диалога, не так ли?

Во всяком случае, здесь была ошибка. Я импортировал файл android.support.v4.app.DialogFragment. Затем, в моей основной деятельности, я импортировал android.app.DialogFragment. Это привело к тому, что мои два метода обратных вызовов в моем основном действии фактически не регистрировались компилятором. Я использовал Android Studio, поэтому, когда вы произвольно импортируете материал, легко отбросить тот факт, что вы не импортировали правильное пространство имен. Doh!

Во-вторых, я узнал, что вы можете просто вызвать dialog.getTag() в диалоговом окне onDialogPositiveClick (диалог диалога). Вы можете проверить это в зависимости от того, какой диалог вы показываете. Таким образом, вы можете иметь несколько диалогов, используя одни и те же методы интерфейса, и просто включайте свою «контрольную» логику.

т.е. у меня есть эта строка:

dialog_save.show(getFragmentManager(), "Dialog_save"); 

Так что я могу просто сделать это, чтобы проверить, какой диалог я нажал кнопку положительного от:

@Override 
 
public void onDialogPositiveClick(DialogFragment dialog) { 
 
    // User touched the dialog's positive button 
 
    
 
    if (dialog.getTag().equals("Dialog_save"){ 
 
     //..do stuff... 
 
    } 
 

 
    if (dialog.getTag().equals("Dialog_cancel"){ 
 
     //..do stuff... 
 
    } 
 
}

0

Вы должны установить вашу деятельность, чтобы быть прослушиватель Вашего нового члена «mListener»

Так Dialogclass вы должны создать геттер/сеттер для вашего слушателя, как это:

public NoticeDialogListener getListener() { return mListener; } 
public void setListener (NoticeDialogListener listener) { mListener=listener; } 

и в вашей деятельности вы бы сделали

CrossoverDeleteDialog dialog_delete = new CrossoverDeleteDialog(); 
     dialog_delete.setListener(this); 
     dialog_delete.show(getFragmentManager(), "Dialog_delete"); 
Смежные вопросы