YungSherman
@YungSherman
Личинка программиста

Почему фрагмент не сохраняет своё состояние?

Пытаюсь создать приложение с архитектурой MVP (Moxy). Дело в том, что фрагмент не сохраняет своё состояние после поворота устройства. Вот метод onCreate активити, в которой запускается фрагмент:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_comments);
    String link = getIntent().getStringExtra(EXTRA_LINK_COMMENTS);
    FragmentManager fragmentManager = getSupportFragmentManager();
    CommentFragment fragment = CommentFragment.newInstance(link);
    fragmentManager.beginTransaction().add(R.id.comments_fragment_host, fragment).commitNowAllowingStateLoss();
}

Код презентера для фрагмента:
@InjectViewState
public class CommentsPresenter extends MvpPresenter<CommentsView> {

private CommentsModel mCommentsModel;

public CommentsPresenter(){
    mCommentsModel = new CommentsModel();
}

@Override
protected void onFirstViewAttach() {
    super.onFirstViewAttach();
    showLoading(true);
    loadComments();
}

public void loadComments(){
    mCommentsModel.loadComments(new CommentsModel.LoadCommentsCallback() {
        @Override
        public void onLoad(List<Comment> comments) {
            getViewState().showComments(comments);
        }
    });
}

public void showLoading(boolean state){
    getViewState().setUpdating(state);
}

public void setLink(String link){
    mCommentsModel.setLink(link);
 }
}

Вот код самого фрагмента:
public class CommentFragment extends MvpAppCompatFragment implements CommentsView{

/*биндим view*/

private CommentsAdapter mCommentsAdapter;
private LinearLayoutManager mLinearLayout;


private static final String ARG_COMMENTS_LINK = "comments_link";
private String mLink;

public static CommentFragment newInstance(String link){
    Bundle bundle = new Bundle();
    bundle.putSerializable(ARG_COMMENTS_LINK, link);
    CommentFragment commentFragment = new CommentFragment();
    commentFragment.setArguments(bundle);
    return commentFragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(getArguments() != null){
        mLink = (String)getArguments().getSerializable(ARG_COMMENTS_LINK);
        setHasOptionsMenu(true);
        setRetainInstance(true);
    }
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.comments_fragment_layout, container, false);
    ButterKnife.bind(this, v);
    AppCompatActivity actionBar = (AppCompatActivity) getActivity();
    actionBar.setSupportActionBar(mToolbar);
    actionBar.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    actionBar.getSupportActionBar().setDisplayShowHomeEnabled(true);
    actionBar.getSupportActionBar().setTitle(R.string.comments_title);
    mCommentsAdapter = new CommentsAdapter();
    mLinearLayout = new LinearLayoutManager(getContext());
    mRecyclerView.setLayoutManager(mLinearLayout);
    mRecyclerView.setAdapter(mCommentsAdapter);
    mCommentsPresenter.setLink(mLink);
    return v;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            getActivity().finish();
            return false;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void setUpdating(boolean state) {
    mSwipeRefreshLayout.setRefreshing(state);
}

@Override
public void showComments(List<Comment> comments) {
    mCommentsAdapter.setComments(comments);
    mCommentsAdapter.notifyDataSetChanged();
    setUpdating(false);
 }
}

У меня есть другой фрагмент, который разработан по аналогичной схеме, но в который не передаётся никакое значение, он работает прекрасно и сохраняет своё состояние.

Где может скрываться ошибка? P.S. В методе onCreate попробовал запускать фрагмент, который работает нормально - он тоже не сохраняется. Мне кажется проблема где-то на уровне onCreate активности.
  • Вопрос задан
  • 234 просмотра
Решения вопроса 1
@klim76
android/java/sql
Мне кажется проблема где-то на уровне onCreate активности.

конечно у вас же при каждом onCreate создается новый фрагмент
пробуйте так:
if (savedInstanceState == null) {
addFragment(R.id.frame, new Fragment());
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы