【问题标题】:Presenter in MVP(Android) gets deleted/gets null inside FragmentMVP(Android)中的演示者在片段中被删除/为空
【发布时间】:2017-09-13 08:02:32
【问题描述】:

我正在使用 MVP。我的活动包含一个片段。我正在初始化,然后将演示者设置为 Main-Activity 的 on Create 方法中的片段,如下所示。

public class MainActivity extends AppCompatActivity {

    private StashPresenter stashPresenter;
    private MainFragment mainFragment;
    FragmentManager fm;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    App.getInstance().getAppComponent().inject(this);
    setContentView(R.layout.activity_main);

    fm = getSupportFragmentManager();

    fm.beginTransaction()
    .add(R.id.fragment_container, MainFragment.newInstance(),"mainFragment")
    .commitNow();

    mainFragment = (MainFragment) fm.findFragmentById(R.id.fragment_container);

    stashPresenter = new StashPresenter(mainFragment);

    mainFragment.setPresenter(stashPresenter);
}

在我的 mainFrgament 类中,我是 setPresenterFunction 中的 settinf Presenter,如下所示。

public class MainFragment extends Fragment implements 
StashContract.PublishToView {

public StashContract.ToPresenter forwardInteraction;

public void setPresenter(StashContract.ToPresenter forwardInteraction)
{
    this.forwardInteraction = forwardInteraction;
}

有时在执行搜索操作时,如我在 mainFragment 的 OnCreateView 中的以下代码所示,我收到一条错误消息,提示我的转发 “尝试在空对象引用上调用接口方法”

有时我会收到此错误,有时我不会。我不明白为什么会这样

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_main, container, false);
    unbinder = ButterKnife.bind(this, view);


    searchView.setOnEditorActionListener((v, actionId, event) -> {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            progressBar.setVisibility(View.VISIBLE);

            forwardInteraction.searchButtonClick(actionId, searchView.getText().toString());

            return true;
        }
        return false;
    });


    String[] artistNames = getResources().getStringArray(R.array.artistNamesSuggestion);
    ArrayAdapter<String> adapterArtist = new ArrayAdapter<>(getActivity().getApplicationContext(), R.layout.fragment_main, R.id.search_phrase, artistNames);
    searchView.setAdapter(adapterArtist);
    searchView.setThreshold(1);

    recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 3));
    recyclerView.setAdapter(adapter);
    recyclerView.addItemDecoration(new SpaceItemDecoration(space, space, space, space));

    return view;
}

【问题讨论】:

    标签: android fragment mvp presenter android-mvp


    【解决方案1】:

    解决方案

    在片段的“onCreateView”方法中,只初始化视图。

    在“onResume”方法中移动其余代码。

    错误原因

    检查这张图片

    如您所见,当您在 Activity 的“onCreate”方法中时,会调用片段的“onCreateView”。

    在您的代码的当前状态下,您可能有时会在演示者初始化之前尝试使用它。

    因此,在活动的“onCreate”方法中设置您的呈现,并在片段的“onStart”或“onResume”上使用它。

    您可以查看此project 以进一步了解 MVP 架构。

    【讨论】:

    • 在 mainActivity 的 onCreate 方法中设置了 Presenter 并在 onStart() 中使用 Presenter 后,它也无法正常工作。我注意到的另一件事是,我的 mainFrgament 的 onResume() 方法被调用了两次。
    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    相关资源
    最近更新 更多