2015-06-21 117 views
0

我在從對話框獲取數據到調用活動時遇到問題。一直遵循Android文檔,但沒有運氣。我只想捕獲某人在我的對話框的編輯文本框中輸入的字符串。這是我的設置。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,因此當你自動導入東西時,可以很容易地忽略你沒有導入正確名稱空間的事實。衛生署!

其次,我發現你可以在onDialogPositiveClick(DialogFragment對話框)中調用dialog.getTag()。你可以根據你顯示的對話來檢查它。通過這種方式,您可以使用相同的接口方法來創建多個對話框,並在其中加入「檢查」邏輯。

即,我有這樣一行:

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,你應該爲你的聽衆這樣一個getter/setter方法:

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