繁体   English   中英

MVP(Android)中的演示者被删除/在Fragment中获取null

[英]Presenter in MVP(Android) gets deleted/gets null inside Fragment

我正在使用MVP。 我的活动包含一个片段。 我正在初始化,然后将Presenter设置为Main-Activity的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;
}

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

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

错误原因

检查这张图片

在此处输入图片说明

如您所见,当您处于活动的“ onCreate”方法中时,将调用片段的“ onCreateView”。

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

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

您可以检查该项目以进一步了解MVP架构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM