2016-06-22 3 views
0

fragment에서 acitvity으로 callback을 전달해야합니다. 불행히도 그 스택 추적을 얻을 :콜백 : java.lang.ClassCastException

왜 그 오류가 발생합니까? 비슷한 문제가있는 게시물을 발견했습니다. 불행히도 나는 왜 아직도 그 문제를 이해하지 못한다.

FATAL EXCEPTION: main 
                    Process: 

    com.stack.overflow, PID: 26190 
                     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.stack.overflow/com.stack.overflow.main.MainActivity}: java.lang.ClassCastException: com.stack.overflow.main.MainActivity cannot be cast tocom.stack.overflow.ReviewMaschineFragment$Callbacks 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                      at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:135) 
                      at android.app.ActivityThread.main(ActivityThread.java:5254) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
                     Caused by: java.lang.ClassCastException:com.stack.overflow.main.MainActivity cannot be cast to com.stack.overflow.reviewmaschine.ReviewMaschineFragment$Callbacks 
                      at com.stack.overflow.reviewmaschine.ReviewMaschineFragment.onAttach(ReviewMaschineFragment.java:101) 
                      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1039) 
                      at android.support.v4.app.BackStackRecord.setLastIn(BackStackRecord.java:795) 
                      at android.support.v4.app.BackStackRecord.calculateFragments(BackStackRecord.java:818) 
                      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:676) 
                      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1671) 
                      at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:388) 
                      at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:619) 
                      at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1236) 
                      at android.app.Activity.performStart(Activity.java:6006) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)  
                      at android.app.ActivityThread.access$800(ActivityThread.java:151)  
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)  
                      at android.os.Handler.dispatchMessage(Handler.java:102)  
                      at android.os.Looper.loop(Looper.java:135)  
                      at android.app.ActivityThread.main(ActivityThread.java:5254)  
                      at java.lang.reflect.Method.invoke(Native Method)  

fragment 클래스 :

public class ReviewMaschineFragment extends Fragment { 

    (...) 

    public interface Callbacks { 
     void onUserChangedData(); 
    } 

    private Callbacks mCallbacks; 

    (...) 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     mCallbacks = (Callbacks) context; 
     EventBus.getDefault().register(this); 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mCallbacks = null; 
     EventBus.getDefault().unregister(this); 
    } 

} 

activity 클래스 :

public class ReviewActivity extends AppCompatActivity implements ReviewMaschineFragment.Callbacks{ 
           
    (...) 

    @Override 
    public void onUserChangedData() { 
     // Do something. 
    } 

    (...) 

} 

답변

3

MainActivityReviewMaschineFragment를 사용하지만, Callbacks를 구현하지 않는 것입니다 귀하의. 당신이 mCallbacks 체크 첫째

if (mCallbacks != null) { 
    mCallbacks.onUserChangedData(); 
} 
+0

지금은 실행할 수 있어요 null가 아닌 것을 사용할 때 이제

@Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof Callbacks) { mCallbacks = (Callbacks) context; } EventBus.getDefault().register(this); } 

: 활동이 Callbacks를 구현하는 경우에만

콜백을 지정하여 onAttach 방법을 변경

응용 프로그램을 다시 호출하지만 콜백은 여전히 ​​호출되지 않습니다. 콜백이 초기화되는 순간을 변경해야합니까? – jublikon

+0

'MainActivity'에서 콜백을 호출하고 싶다면'ReviewActivity'에서했던 것처럼'Callbacks'을 구현하십시오 –

+0

작동합니까? 알려줘 –

관련 문제