Search code examples
androiddagger-2moxy

Moxy with dagger doesn't save view state after rotation


I'm using Moxy and Dagger 2 in my app. It looks like that dagger works well, but Moxy doesn't restore view state after rotation, and i don't understand why.

Here is my View:

public interface MyView extends MvpView {

    void changeNote(String text);

}

Fragment:

  public class MyFragment extends MvpFragment implements MyView {

    @BindView(R.id.edittext_login)
    EditText mEditText;

    @BindView(R.id.text_view)
    TextView mTextView;

    @Inject
    @InjectPresenter
    Presenter mPresenter;

    @ProvidePresenter
    Presenter providePresenter() {
        return mPresenter;
    }

    @OnClick(R.id.action_btn)
    public void onClickLoginBtn() {
        mPresenter.doActionsAndShowText(mEditText.getText().toString());
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        doInject();
        super.onCreate(savedInstanceState);
    }

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

    protected void doInject() {
        ((App) getActivity().getApplication()).getComponent().inject(this);
    }

    @Override
    public void changeText(String text) {
        mTextView.setText(text);
    }

}

Presenter:

@InjectViewState
public class Presenter extends MvpPresenter<MyView> {

    private MyRepository mMyRepository;

    @Inject
    public Presenter(@NonNull final MyRepository myRepository) {
        mMyRepository = myRepository;
    }

    void doActionsAndShowText(@NonNull String text) {
        text = mMyRepository.workWithText(text);
        getViewState().changeText(text);
    }

}

My Activity also extends MvpActivity(I'm tried without it, but it doesn't help), but not implements MyView, because there are no reason for it. I want to work with fragments and inject presenters into fragments, not in activity.

So, here I'm displaying processed text from EditText, and after rotating it disappears. What i'm doing wrong? Why Moxy doesn't restore the state of view in my case? Was i inject presenter in correct way? Please explain me, if you see :)


Solution

  • I think you replace this fragment in your activity on each activity onCreate call. Add to your activity something like if (savedInstanceState == null) { replaceFragment }