
[英]Android MVP - when retaining presenter in headless fragment how to ensure view gets update during config change?
[英]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.