2016-07-27 4 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?. 나는 아마도 Intent를 사용할 수 있다는 것을 알고 있지만 Observer Pattern을 구현하고 싶습니다. 이해해야하는 부분이기 때문에 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