popBackStack
を実行し、バックスタックの前のフラグメントに戻ると、メソッドonViewCreated(View view, Bundle bundle)
のバンドルは、 onSaveInstanceState(Bundle outState)
は以前には呼び出されませんでした。だから、私たちが戻ると、バンドルはヌルであり、プレゼンタ(およびビューステート)が再び作成されます。この場合、プレゼンターとビューの状態を再利用して再作成することはできますか?Mosby 3 MVP - バックスタックのフラグメントに戻ると常にプレゼンターが再作成されます
以下にダミーの例があります。 2つのボタンを持つフラグメントがあります。 1つのボタンが新しいフラグメントを開き、別のボタンが前のボタンに移動します。戻ると、発表者とビューの状態が再現されます。それは私が必要ではありませんが、私はなぜそれがライブラリのコードに従って起こっているのかを説明しました。 戻るときにプレゼンターとビューステートを再利用する方法はありますか?
public class FirstFragment extends MvpViewStateFragment<FirstFragmentView, FirstFragmentPresenter, FirstFragmentViewState> {
public static final String TAG = "TAG";
private Button moveToAnotherFragmentButton;
private Button moveBackButton;
@Nullable
@Override
public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) {
final View rootFragmentView = inflater.inflate(R.layout.first_fragment, container, false);
moveToAnotherFragmentButton = (Button) rootFragmentView.findViewById(R.id.first_fragment_go_to_another_fragment_button);
moveBackButton = (Button) rootFragmentView.findViewById(R.id.first_fragment_back_button);
return rootFragmentView;
}
@Override
public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
moveToAnotherFragmentButton.setOnClickListener(ignored -> addToStack(FirstFragment.class));
moveBackButton.setOnClickListener(ignored -> getFragmentManager().popBackStack());
}
@Override
@NonNull
public FirstFragmentPresenter createPresenter() {
Log.e(TAG, "createPresenter");
return new FirstFragmentPresenter();
}
@NonNull
@Override
public FirstFragmentViewState createViewState() {
Log.e(TAG, "createViewState");
return new FirstFragmentViewState();
}
@Override
public void onNewViewStateInstance() {
Log.e(TAG, "onNewViewStateInstance");
}
private void addToStack(@NonNull final Class<? extends Fragment> fragmentClass) {
final FragmentManager fragmentManager = getFragmentManager();
if (fragmentManager.isDestroyed()) {
throw new UnexpectedException("FragmentManager is destroyed");
}
final Fragment fragment = Fragment.instantiate(getContext(), fragmentClass.getName());
final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragmentTransaction.replace(R.id.activity_main_content_container, fragment, null)
.addToBackStack(null)
.commit();
}
}
ここにコードを入れてください –
@LuizFernandoSalvaterra私は小さな例を追加しました –