Android 如何从父视图传递数据';s演示者到子视图';主持人是谁?

Android 如何从父视图传递数据';s演示者到子视图';主持人是谁?,android,mvp,Android,Mvp,我在Android中使用MVP模式。结构如下图所示 Activity - Presenter | Fragment | CustomView | views 因此,当演示者从网络获取数据时,它直接将数据传递给片段,片段将数据传递给自定义视图,自定义视图将数据传递给视图 我不确定如何通过MVP模式从活动传递视图中使用的数据。如果我为每个片段、自定义视图和视图创建演示者,那么如何将数据从活动的演示者传递给其他演示者? 有人能帮我举个例子吗?为了给你的问题提供更具体的答案

我在Android中使用MVP模式。结构如下图所示

Activity - Presenter
    |
Fragment
    |
CustomView
    |
  views
因此,当演示者从网络获取数据时,它直接将数据传递给片段,片段将数据传递给自定义视图,自定义视图将数据传递给视图

我不确定如何通过MVP模式从活动传递视图中使用的数据。如果我为每个片段、自定义视图和视图创建演示者,那么如何将数据从活动的演示者传递给其他演示者?
有人能帮我举个例子吗?

为了给你的问题提供更具体的答案,你需要举个具体的例子。每个解决方案都在上下文中有效。我会给你几种方法。选择一个适合你的问题

MVP非常重要的部分是模型。据我所知,Model一词随着该论文的发布而在编程中流行起来,该论文后来被改进并重命名为MVC

本文中模型的概念定义为:

模型是以 计算系统中的数据

模型在计算机中表示为一组数据 以及处理这些数据所需的方法

随着时间和经验的推移,人们发现并指定了不同类型的模型

以下是其中一些:

  • 应用程序模型(请阅读以了解更多信息)
MVP,因为它源于MVC,所以它有两个主要的职责分工:模型(表示概念的抽象)和演示(查看和演示者以可视化模型

因为我们已经将模型演示分开,所以我们可以有多个视图,它们以不同的方式显示相同的模型。这方面的一个例子是表示统计数据的模型,它可以以不同的方式显示:饼图、条形图等。在这个例子中统计数据模型是一个领域模型

在上面的示例中,模型可能会在两个视图演示者对饼图条形图之间共享。如果使用,当其中一个查看演示者对更新统计模型时,它将引发更改的事件,并且两个查看演示者对都将收到此更改和更新的通知

有时应用程序需要一个应用程序模型。此模型可以在不同的视图演示对之间共享。让我们来看一个Vrimy简化的例子。 假设我们有一个类似Windows资源管理器的文件浏览器应用程序。该应用程序的GUI有两个主要部分:显示文件夹树的左侧面板和中间的文件文件夹面板。当在左文件夹树面板中选择文件夹时,必须从中间面板中显示所选文件夹中的文件和文件夹。我们可以通过定义一个应用程序模型来实现这一点,该模型将捕获并表示上述逻辑,并在左面板和中面板的视图表示对之间共享

注意:为了简化示例,我将省略细节,并编写更少的代码

在本例中,我们创建了一个共享对象,该对象表示应用程序状态和逻辑,我们的应用程序具有可以更改的选择。在这种情况下,ApplicationState类是模型的一部分,是一个应用程序模型。因为它是共享的,并且它的生命周期与应用程序相同(只要应用程序运行,它就存在),所以它将保持状态视图演示者被创建和销毁,但此类将存在并保持状态,以便在创建新的视图和/或演示者时,它可以检查此状态并执行某些操作

根据我的经验,人们确实更关注视图和演示者,而他们应该关注他们的模型。我经常使用模型,因为它使事情更清晰,应用程序更容易理解

当然,使用模型并不总是有效的,因此当它们不起作用时,您可以使用消息传递,让一个演示者向其他人发送消息。下面是一个使用相同文件浏览器应用程序的示例

public class MessageBus {
    // static this time, you can use DI or ServiceLocator with interface
    public static void sendMessage(object m) { }
    public static void registerListener(MessageListener listener) { }
}

public class FoldersTreeViewPresenter {

    public void onSelectFolder(FolderView view) {
        // select the folder in the view
        MessageBus.sendMessage(new FolderSelected(view.Folder));
    }
}

public class FilesFoldersViewPresenter : MessageListener {

    public FilesFoldersViewPresenter() {
        MessageBus.addListener(this);
    }

    private void getFilesAndFoldersFromFileSystem(Folder folder) {
        // get from fs
        // fill views with them etc.
    }

    public void onMessage(object m) {

       if(m instanceof FolderSelected) {

            FolderSelected folderSelectedMessage = (FolderSelected)m;

            getFilesAndFoldersFromFileSystem(folderSelectedMessage.Folder);
       }
    }
}
根据您的具体情况,如果您可以创建一个好的模型,无论是域、应用程序还是演示文稿,那么就这样做。共享此模型,从而从演示者创建对模型的依赖关系,而不是在演示者之间创建依赖关系。这样一来,演示者之间就有了松散的耦合,可以更轻松地进行更改

如果无法使用型号,请使用消息。通过创建用于通信的消息的协议,这是一种很好的分离演示者的方法

查看有关在组件之间使用消息进行协作的文章

这里还有一些关于GUI体系结构的好文章:

public class MessageBus {
    // static this time, you can use DI or ServiceLocator with interface
    public static void sendMessage(object m) { }
    public static void registerListener(MessageListener listener) { }
}

public class FoldersTreeViewPresenter {

    public void onSelectFolder(FolderView view) {
        // select the folder in the view
        MessageBus.sendMessage(new FolderSelected(view.Folder));
    }
}

public class FilesFoldersViewPresenter : MessageListener {

    public FilesFoldersViewPresenter() {
        MessageBus.addListener(this);
    }

    private void getFilesAndFoldersFromFileSystem(Folder folder) {
        // get from fs
        // fill views with them etc.
    }

    public void onMessage(object m) {

       if(m instanceof FolderSelected) {

            FolderSelected folderSelectedMessage = (FolderSelected)m;

            getFilesAndFoldersFromFileSystem(folderSelectedMessage.Folder);
       }
    }
}