【问题标题】:Passing context of fragment to a class which executes a method in the fragment through an interface将片段的上下文传递给通过接口执行片段中的方法的类
【发布时间】:2016-11-08 13:43:18
【问题描述】:

我有一个片段,它通过一个类 NetworkConnector 以及一个监听下载完成的 RequestCompleteListener 类来初始化下载过程。

NetworkConnector 的构造函数

public NetworkConnector(Context ctx, String url, String methodType, int downloadId, 
          ArrayList<ArrayList<String>> postData, RequestCompleteListener<String> listener) 

该类进行下载,并通过名为 RequestCompleteListener 的接口执行 OnRequestExecuted 方法。

public class OnRequestComplete implements RequestCompleteListener<String> {
private DataProcessInterface dataProcessInterface;

public OnRequestComplete(Context context) {
    dataProcessInterface = (DataProcessInterface) context;
}

@Override
public void onRequestExecuted(String responseType, String result, int downloadId) {
    if (!responseType.equals("error")) {
        dataProcessInterface.processData(result, downloadId);
    } else {
        dataProcessInterface.processError(result, downloadId);
    }
}
}

片段实现接口DataProcessInterface。而 OnRequestCompleted 方法通过接口在使用的片段中执行方法 processData 和 processError。

public class FoodListFragment extends Fragment implements DataProcessInterface {

当从活动中执行时,此过程可以正常工作。但是当这通过一个片段完成时,我得到ClassCastException,因为它需要片段的上下文来代替 ???下面。

 new NetworkConnector(getActivity(), url, "GET", 101, null, new OnRequestComplete(???));

getActivity()view.getContext() 不工作的原因很明显。当我尝试FoodListFragment.this 时,错误提示OnRequestComplete 需要上下文而不是片段。

那么应该通过什么来代替 ??? ?我不想在activity中实现DataProcessInterface接口,然后用另一个接口来展示fragment中的数据。

【问题讨论】:

    标签: android android-fragments interface


    【解决方案1】:

    片段不是上下文,它可能有上下文。您将上下文传递给 OnRequestComplete 实例并尝试将其转换为 DataProcessInterface。为了清楚起见,您可能应该直接传递接口。

    public class OnRequestComplete implements RequestCompleteListener<String> {
        private DataProcessInterface dataProcessInterface;
    
        public OnRequestComplete(DataProcessInterface dpi) {
            dataProcessInterface = context;
        }
    <....>
       }
    

    现在下面应该可以工作了。

    new NetworkConnector(getActivity(), url, "GET", 101, null, new OnRequestComplete(FoodListFragment.this));
    

    更新: 请注意,我认为您会因这种设计而受到伤害。您有泄露上下文和片段的风险。

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多