2016-06-22 9 views
0

Problem: Ich brauche eine callback von einem fragment zu einem acitvity passieren. Leider bekomme ich diese Stack-Trace:Rückrufe: java.lang.ClassCastException

Warum bekomme ich diesen Fehler? Ich habe einige Posts mit einem ähnlichen Problem gefunden. Leider verstehe ich immer noch nicht, warum ich dieses Problem bekomme.

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)  

Meine fragment Klasse:

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

} 

Meine activity Klasse:

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

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

    (...) 

} 

Antwort

3

Ihre MainActivity ist ReviewMaschineFragment verwenden, aber ist nicht Callbacks zu implementieren.

Ihre onAttach Methode Ändern Sie nur einen Rückruf zuweisen, wenn die Aktivität implementiert Callbacks:

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 

    if (context instanceof Callbacks) { 
     mCallbacks = (Callbacks) context; 
    } 
    EventBus.getDefault().register(this); 
} 

Wenn Sie jetzt mCallbacks geprüft, ob tatsächlich verwenden, dass es

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

jetzt nicht null ist, ich bin in der Lage zu laufen die App erneut, aber der Rückruf wird noch nicht aufgerufen. Muss ich den Zeitpunkt ändern, zu dem die Callbacks initialisiert werden? – jublikon

+0

Wenn Sie möchten, dass der Callback in Ihrer 'MainActivity' aufgerufen wird, implementieren Sie' Callbacks' wie Sie es mit 'ReviewActivity' gemacht haben. –

+0

Funktioniert es? Gib mir Bescheid –