2016-10-26 3 views
0

프래그먼트에서 호출하는 대화 상자를 만들었습니다.프래그먼트에서 DialogFragment를 호출하는 Android 예외

MainActivity에서 Listener를 구현해야한다는 예외가 발생합니다.

하지만 조각으로 구현했습니다. 뭐가 잘못 되었 니?

E/AndroidRuntime: FATAL EXCEPTION: main 
         Process: net.techabout.appointment, PID: 4162 
         java.lang.ClassCastException: [email protected] deve implementar MyDialogFragmentListener 
          at net.techabout.appointment.AndroidDialogFragment.onAttach(AndroidDialogFragment.java:53) 
          at 

android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1043) 
          at android.support.v4.app.BackStackRecord.setLastIn(BackStackRecord.java:838) 

///// 내 조각

public class HorariosMedFragment extends Fragment implements 
      AndroidDialogFragment.MyDialogFragmentListener { 

    ........... 
    ...... 
     void OpenDialog(String title, String msg, String but_sim, String but_nao) { 
      AndroidDialogFragment myDialogFragment = AndroidDialogFragment 
        .newInstance(title, msg, but_sim, but_nao); 
      myDialogFragment.show(getFragmentManager(), "myDialogFragment"); 
     } 
     @Override 
     public void onDialogPositiveClick(DialogFragment dialog) { 
      //do something 
     @Override 
     public void onDialogNegativeClick(DialogFragment dialog) { 
      dialog.dismiss(); 
     } 

    } 

// MyDialogFragment

public class AndroidDialogFragment extends DialogFragment { 

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

     // Usa essa instância da interface para entregar eventos de ação 
     MyDialogFragmentListener mListener; 

     static AndroidDialogFragment newInstance(String titulo, String msg,String but_sim, String but_nao) { 
      AndroidDialogFragment dialog = new AndroidDialogFragment(); 
      Bundle args = new Bundle(); 
      args.putString("title", titulo); 
      args.putString("but_sim", but_sim); 
      args.putString("but_nao", but_nao); 
      args.putString("msg", msg); 

      dialog.setArguments(args); 
      return dialog; 
     } 


     @Override 
     public void onAttach(Context context) { 
      super.onAttach(context); 
      // Verifica se a activity implementa a interface de callbacks 
      try { 
       // Instancia o MyDialogFragmentListener para que possamos enviar 
       // eventos para o host 
       mListener = (MyDialogFragmentListener) context; 
      } catch (ClassCastException e) { 
       // Essa activity não implementa a interface, levanta exceção 
       throw new ClassCastException(context.toString() 
         + " deve implementar MyDialogFragmentListener"); 
      } 
     } 

     @Override 
     public Dialog onCreateDialog(Bundle savedInstanceState) { 
      String title = getArguments().getString("title"); 
      String but_sim = getArguments().getString("but_sim"); 
      String but_nao = getArguments().getString("but_nao"); 
      String msg = getArguments().getString("msg"); 
      Dialog myDialog = new AlertDialog.Builder(getActivity()) 
        .setIcon(R.drawable.ic_launcher) 
        .setTitle(title) 
        .setMessage(msg) 
        .setPositiveButton("OK", new DialogInterface.OnClickListener() { 

         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          // Dispara o evento onDialogPositiveClick para a 
          // activity que estiver escultando 
          mListener.onDialogPositiveClick(
            AndroidDialogFragment.this); 
         } 
        }) 
        .setNegativeButton("Cancelar", 
          new DialogInterface.OnClickListener() { 

           @Override 
           public void onClick(DialogInterface dialog, 
                int which) { 
            // Dispara o evento onDialogNegativeClick para a 
            // activity que estiver escultando 
            mListener.onDialogNegativeClick(
              AndroidDialogFragment.this); 
           } 
          }).create(); 

      return myDialog; 
     } 

    } 
+0

'mListener = (MyDialogFragmentListener) context'가 클래스 캐스팅 예외의 원인입니다. 한 가지 방법은 인터페이스를 통해 framgent를 호스팅하고 Fragment와 통신하는 활동으로 다시 의사 소통하는 것입니다. 또는 이벤트 버스 또는 http://stackoverflow.com/questions/13733304/callback-to-a-fragment-from-a-dialogfragment를 사용하십시오. 여기에 게시 된 링크에서 답을 시도하지 않았습니다. – Raghunandan

+0

좋아, 내가 볼게. 덕분에 –

답변

1

만드는 동안 대화 조각 인스턴스 설정 대상의 조각이 후

myDialogFragment.setTargetFragment(HorariosMedFragment.this,0); 

추천 DialogFragment 사용 당신은 기본적으로 MyDialogFragmentListener에 활동의 컨텍스트를 캐스팅하려고이 mListener = (MyDialogFragmentListener) context을하고있는, onAttach에서 조각

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    try { 
     mListener = (MyDialogFragmentListener) getTargetFragment(); 

    } catch (ClassCastException e) { 
     throw new ClassCastException("Calling Fragment must implement MyDialogFragmentListener"); 
    } 
} 
+0

좋습니다. 그것은 아주 잘 작동합니다. 고맙습니다 –

0

을 대상 메소드 GET을 만듭니다. HorariosMedFragment에 인터페이스를 구현했습니다. 그러나이 HorologiesMedFragment의 컨텍스트는 실제로 HorariosMedFragment가 시작된 Activity 클래스 (MainActivity)에 속합니다. MainActivity 클래스는 리스너를 구현하지 않았으므로 컨텍스트를 mListener로 캐스팅 할 수 없습니다.

관련 문제