2016-07-27 15 views
0

これはかなり一般的な質問ですが、私はかなりの類似した投稿を見て、いくつかのガイドに従っていますが、これを動作させることはできません。DialogFragmentインターフェイスからコールバックを受信して​​いないアクティビティ

あなたが見ることができるように、ボタンが押され
NavigationView mDrawerList = (NavigationView) findViewById(R.id.main_navigation); 

    Menu navMenu = mDrawerList.getMenu(); 
    topChannelMenu = navMenu.addSubMenu("Stuff"); 
    final Button addButton = (Button) findViewById(R.id.add_button); 
    addButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      MyDialog addDialog = new MyDialog(); 
      addDialog.show(getSupportFragmentManager(), "AddDialog"); 
      addDialog.setDialogResult(new AddDialog.MyDialogListener() { 
       @Override 
       public void onDialogPositiveClick(MyObject objectToSend) { 
        topChannelMenu.add(objectToSend.toString()); //Not getting called 
        Log.d(TAG, "Item added"); 
       } 
      }); 


     } 
    }); 

(ナビゲーション引き出しの中にあります)、ダイアログを(関連するクラスは、以下に含ま)が開きます:

以下は主な活動のために私のコードです。ユーザが何らかのデータを入力し、ポジティブなダイアログボタンを押すと、データがアクティビティに送信されるように促すはずです。私はこの答えで推奨される解決策を使用しようとしました:How can I pass values between a Dialog and an Activity?。私はおそらくインテントを使うことができると知っていますが、Observer Patternを実装したいと思っています。これは私が理解するのに苦労しているものです。

次はMyDialogのためのコードです:

public class MyDialog extends DialogFragment { 


MyDialogListener mListener; 

public interface MyDialogListener{ 
    public void onDialogPositiveClick(MyObject objectToSend); 
} 
@Override 
@NonNull 
public Dialog onCreateDialog(Bundle savedInstanceState){ 

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    View view = inflater.inflate(R.layout.add_plant_dialog, null); 
    edit1 = (EditText) view.findViewById(R.id.res1_edit); 
    edit2 = (EditText) view.findViewById(R.id.res2_edit); 
    edit3 = (EditText) view.findViewById(R.id.res3_edit); 
    builder.setView(view); 
      builder.setPositiveButton(R.string.add, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        String selectedName = edit1.getText().toString(); 
        String selectedSpec = edit2.getText().toString(); 
        String selectedTemp = edit3.getText().toString(); 
        MyObject userObject = new Plant(selectedName, selectedSpec); 
        mDBHandler = new DBHandler(getActivity(), null, null, 1); 
        mDBHandler.addToDB(userObject); 
        mListener.onDialogPositiveClick(userObject); 


       } 
      }) 
      .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 


       } 
      }); 


    //return createdDialog; 
    return builder.create(); 
} 

@Override 
public void onAttach(Activity activity){ 
    super.onAttach(activity); 
    // Verify that activity implements the listener 
    try { 
     // Instantiate the MyDialogListener so we can send events to host 
     mListener = (MyDialogListener) activity; 
    } catch (ClassCastException e){ 
     throw new ClassCastException(activity.toString() + " must implement " + 
       "MyDialogListener interface"); 
    } 
} 

public void setDialogResult(MyDialogListener listener){ 
    mListener = listener; 
} 
} 

私はインターフェイスを使用するには大きすぎるではないので、私は、これは正しくメソッドを実装していないの単純なミスであるのかはわからない場合、またはこれは、DialogFragmentのライフサイクルと関係があるより微妙なものです。私は本当に助けていただきありがとうございます。前もって感謝します。

+0

発生している問題は何ですか? – Ginandi

+0

最初のコードスニペットにコメントされた行は決して実行されません。 onDialogPositiveClick(MyObject objectToSend)がアクティビティで呼び出されていません。 –

答えて

0

メソッドを使用してリスナーを明示的に設定する必要はありません。あなたのホストのアクティビティがインタフェースを実装していることを確認し、フラグメントのonAttachメソッドで参照を取得します。

+0

うん、それはそれをした。 setDialogResult()を削除し、onDialogPositiveClick()をオーバーロードしました。私が言ったように、私はまだインターフェイスを実装するつもりを取得しようとしているので、あなたの助けに感謝します! –

+0

助けて嬉しい=) – Hitesh

関連する問題