2017-07-18 8 views
0

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(); 
} 
} 
+0

ここにコードを入れてください –

+0

@LuizFernandoSalvaterra私は小さな例を追加しました –

答えて

1

このライブラリの作成者はこの質問に回答しましたhereです。短い答え: "この行動は意図されていませんでした"。

関連する問題