首页 > 解决方案 > Android MVP,获取剪贴板数据时同样的旧上下文问题?

问题描述

所以我需要在presenter中获取剪贴板数据。这意味着我需要context. 不幸的是,如果它是唯一的标准方式,我对依赖注入一无所知。我研究了一些解决方案,但它们被称为错误的解决方案。

public class MainActivityPresenter implements MainActivityInterfaces.MainToPresenter {

MainActivityInterfaces.PresenterToMain main;


public MainActivityPresenter (MainActivityInterfaces.PresenterToMain main) {
    this.main = main;
}


@Override
public void processUrl() {
    String url = Utils.getClipboardData(context);
    if (url.isEmpty()) {

    } else {

    }
}


}

这是 Utils 类中的方法

public static String getClipboardData (Context context) {
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
        android.text.ClipboardManager cm = (android.text.ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
        String result = cm.getText().toString();
        return result==null?"":result;
    } else {
        ClipboardManager cm = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
        ClipData.Item item = cm.getPrimaryClip().getItemAt(0);
        if (item != null)
            return item.getText().toString();
        else
            return "";
    }
}

标签: androidmvpandroid-mvp

解决方案


正确的方法,演示者不应该知道任何特定的 Android 元素,ClipboardManager或者Context(即:它应该是纯 Java)。剪贴板逻辑应该发生ViewPresenter.

丑陋的方式,如果要继续这个设计,processUrl应该带Context,想必这个方法是从视图中调用的吧?这就是可以提供上下文的地方。

@Override
public void processUrl(Context context) {
    String url = Utils.getClipboardData(context);
    if (url.isEmpty()) {

    } else {

    }
}

在视图中:

presenter.processUrl(getApplicationContext());

另一种解决方案是向演示者询问视图的上下文:

@Override
public void processUrl() {
    final Context context = view.getContext();
    String url = Utils.getClipboardData(context);
    if (url.isEmpty()) {

    } else {

    }
}

//In the view
void Context getContext() {
    return getApplicationContext();
}

推荐阅读