android - 将演示者传递给 Android 中的 fragment (没有构造函数)

标签 android fragment mvp

我想尝试将 MVP 模式用于我正在编写的一个简单的 Android 应用程序。这是我第一次使用 MVP 模式,因为我还在学习,所以请温柔点;)

我有一个 fragment ,我想与 4 位不同的演示者一起使用。我遇到的问题是,如何将不同的演示者传递给每个实例?

喜欢将演示者传递给构造函数,但是当 Android 重新创建 fragment 时,它会调用默认构造函数。这是否意味着它将不再包含对演示者的引用?

如果是这样,我还能如何传递演示者?

我在下面包含了一些我想做的伪代码。请注意,我只是直接将其输入浏览器,因此可能会出现一些愚蠢的错误,但希望您能大致了解我的意思。

我的 2 个接口(interface):

public interface IClickableListPresenter {

    ListAdapter createListAdapter();
    void onListItemClick(int position);

}

public interface ITabbable {

    String getTitle();
    Fragment getFragment();

}

2 位演示者示例:

public class ArtistPresenter implements IClickableListPresenter {

    public ListAdapter createListAdapter(){
        // Create a ListAdapter containing a list of artists
    }

    public void onListItemClick(int position){
        // Handle the click event
    }
}

public class TitlePresenter implements IClickableListPresenter {

    public ListAdapter createListAdapter(){
        // Create a ListAdapter containing a list of song titles
    }

    public void onListItemClick(int position){
        // Handle the click event in a completely different way 
        // to the ArtistPresenter
    }

}

我的 fragment :

public class ClickableListFragment extends ListFragment 
                                    implements ITabbable {

    private IClickableListPresenter presenter;
    private String title;

    // What can I do instead of this constructor?
    public ClickableListFragment(
            String title, IClickableListPresenter presenter){

        this.title = title;
        this.presenter = presenter;
    }

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setListAdapter(presenter.createListAdapter());
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id){
        presenter.onListItemClick(position);
    }

    public Fragment getFragment(){
        return this;
    }

    public String getTitle(){
        return title;
    }

}

最后,实例化 fragment 的类:

public class TabsPagerAdapter extends FragmentPagerAdapter{

    private ITabbable tabs[] = {
            new ClickableListFragment("Artist", new ArtistPresenter()),
            new ClickableListFragment("Title", new TitlePresenter()),
            //...
    };

    //...
 }

最佳答案

你可以这样做

public class TabsPagerAdapter extends FragmentPagerAdapter{

    private ITabbable tabs[] = {
        ClickableListFragment.newInstance(ClickableListFragment.Type.ARTIST),
        ClickableListFragment.newInstance(ClickableListFragment.Type.TITLE),
        //...
    };
}

在 ClickableListFragment 中

public enum Type {
    ARTIST,

    TITLE
}

public static MyFragment newInstance(final Type fragmentType) {
    final MyFragment fragment = new MyFragment();
    Bundle args = new Bundle();
    args.putSerializable(TYPE, fragmentType);
    fragment.setArguments(args);
    return fragment;
}

并在 onCreate 中

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Type tempType = (Type) getArguments().getSerializable(TYPE);
    if(tempType == Type.ARTIST){
        variable = new ArtistPresenter(); 
        .... what you want with that variable
    .
    .
    .
}

关于android - 将演示者传递给 Android 中的 fragment (没有构造函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23119009/

相关文章:

android - 在进程之间发送大量数据的最佳方法是什么?

android - 以编程方式具有两个主题的一项 Activity

android - 通过命令行 Android 使用 FFMPEG 从选定图像创建视频

android - 从 Activity 调用 FragmentPagerAdapter

java - 在 MVP/MVC 架构中使用有状态 Bean 作为呈现器/ Controller 是个好主意吗?

android - 就单元测试而言,Android 的 MVP 或 MVVM?

android - 应该使用什么过程来压缩 SKMaps.zip 文件以便在 Skobbler 支持的应用程序中使用?

android - 如何将 Android fragment 添加到 Activity 中?

android - ListView 不刷新 fragment 与 viewpager 选项卡

java - 实现MVP的最佳方法