ClassException转换接口

时间:2017-09-15 09:48:39

标签: android android-fragments interface

我有一个片段,它在MainActivity中使用,实际上它在MainActivity中的ViewPager中使用。

public class Myfragment extends Fragment implements MySingleton.ResponseInterface{


    public static Myfragment newInstance() {
        final Myfragment mf = new Myfragment();
        return mf;
    }

    public Myfragment() {
    }

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        //.....
        final MySingleton mysingleton = MySingleton.getInstance(getContext());

        //I have a button in the fragment that I use like this

        myButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            mysingleton.getSomeResponse();
        }
    });

}

@Override
    public void onResponseGiven(String response) {
        Log.d("response", response);
    }

}

我有一个Singleton类用于不同的动作,单例包括一个接口:

public class MySingleton{


    private static MySingleton mInstance;
    private static Context mContext;
    public ResponseInterface responseInterface;

    private MySingleton(Context context){
        mContext = context;
        this.responseInterface = (ResponseInterface) context;

    }

    public static synchronized MySingleton getInstance(Context context){
        if(mInstance == null){
            mInstance = new MySingleton(context);
        }
        return mInstance;
    }

    public void getSomeResponse(){
       responseInterface.onResponseGiven("send response");
    }


    public interface ResponseInterface{
        void onResponseGiven(String response);
    }
}

为什么ClassCastException告诉MainActivity无法转换为MySingleton.ResponseInterface?

4 个答案:

答案 0 :(得分:1)

MySingleton班级

public class MySingleton{


private static MySingleton mInstance;
private static Context mContext;
public ResponseInterface responseInterface;

private MySingleton(Context context){
    mContext = context;
}

public static synchronized MySingleton getInstance(Context context){
    if(mInstance == null){
        mInstance = new MySingleton(context);
    }
    return mInstance;
}

public void getSomeResponse(ResponseInterface responseInterface){
    this.responseInterface = responseInterface;
    responseInterface.onResponseGiven("send response");
}


public interface ResponseInterface{
    void onResponseGiven(String response);
}
}

Fragment

final MySingleton mysingleton = MySingleton.getInstance(getActivity());
// edited here
mysingleton.getSomeResponse(Myfragment.this);

答案 1 :(得分:0)

如果您将MainActivity投射到MySingleton.ResponseInterface,则必须确保正在实施它。

在您的实际代码中,MyFragment正在实施MySingleton.ResponseInterface 我猜 MainActivity不

当您致电MySingleton.getResponse()时,您正在向您的单身人士中的responseInterface发送讯息。 (我猜你的活动,因为它是你创建单例实例时的上下文)。

public void getSomeResponse(){
   responseInterface.onResponseGiven("send response");
}

如果您想获得片段的答案,您必须确保单例调用您的片段实例。

无论如何,有一个非常系列的设计问题。将片段/活动实例附加到您的单例可能会导致记忆泄漏,如果您在销毁它们时没有释放。阅读this

此外,您的单身人士并非真正的单身人士,您每次致电getIntance后都会创建一个新实例。

答案 2 :(得分:0)

您应该将this传递给getInstance方法:

 MySingleton.getInstance(this);

并尝试将其转换为MySingleton.ResponseInterface而不是MySingleton。

答案 3 :(得分:0)

您正在获取类强制转换异常,因为在行final MySingleton mysingleton = MySingleton.getInstance(getContext());中,您正在传递活动上下文,并且您正在尝试将该上下文强制转换为ResponseInterface。 ResponseInterface由Myfragment实现。

要解决它:您可以更改MySingeton类构造函数,如下所示

private MySingleton(Context context, ResponseInterface responseInterface){
    mContext = context;
    this.responseInterface = responseInterface;

}

和调用部分(在MyFragment OnCreateView中)为

final MySingleton mysingleton = MySingleton.getInstance(getContext(), this);

和getInstance方法为

 public static synchronized MySingleton getInstance(Context context, ResponseInterface responseInterface){
    if(mInstance == null){
        mInstance = new MySingleton(context, responseInterface);
    }
    return mInstance;
}