【问题标题】:java.lang.ClassCastException for interface On android javajava.lang.ClassCastException for interface On android java
【发布时间】:2018-12-30 10:04:20
【问题描述】:

我在下面有一个 Dialog 片段类,它的接口抛出以下异常:

**java.lang.ClassCastException: **

public class FolderPickerDialog extends DialogFragment {
    @Override
    public void onAttach(Context context) {
        this.listner=(FolderPickerDialog.FolderPickerListner)context;
        super.onAttach(context);
    }

    public interface FolderPickerListner {
        void onFolderSelected(String path)
    }
}

我已经在下面的类中实现了监听器:

public class SaveDialog extends DialogFragment implements FolderPickerDialog.FolderPickerListner {

    @Override
    public void onFolderSelected(String path) {
        ic_path.setText(path);
    }

}

我的原木猫

java.lang.ClassCastException: com.nanosoft.icstudio.activities.MainActivity cannot be cast to com.nanosoft.icstudio.Dialogs.FolderPickerDialog$FolderPickerListner
at com.nanosoft.icstudio.Dialogs.FolderPickerDialog.onAttach(FolderPickerDialog.java:43)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1231)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2013)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:710)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5765)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:107)

【问题讨论】:

    标签: java android interface


    【解决方案1】:

    错误说明的是这一行:

    this.listner=(FolderPickerDialog.FolderPickerListner) context;
    

    您尝试将context(即MainActivity 的上下文)转换为FolderPickerDialog.FolderPickerListner 对象,这是不可能的。

    【讨论】:

    • 但是接口是在另一个对话框片段中实现的,而不是在活动中。
    • onAttach() 中的参数contextMainActivity 的上下文。
    【解决方案2】:

    要通过生命周期事件将侦听器回调传递给FolderPickerDialog,您可以执行以下操作:

    FolderPickerDialog:

    private FolderPickerListner listener;
    ...
    @Override
        public void onAttach(Context context) {
            this.listener=(FolderPickerListner)context;
            super.onAttach(context);
        }
    

    活动中:

    public class MainActivity extends AppCompatActivity implements FolderPickerDialog.FolderPickerListner {
    
    ...
    
    
    }
    

    【讨论】:

    • 我已经在另一个不在mainactivity中的dialogfragment中实现了它
    • @Naveed onAttach 在片段首次附加到其上下文(活动)时调用,而不是附加到另一个对话框片段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多