2017-02-21 8 views
1

私はMosby MVPライブラリを使用してAndroidアプリで作業しています。 1つの特定のフラグメントでは、ViewStateは実装されましたが、使用されませんでした(状態は変更されませんでした)。ビューロジックのいくつかはwidgetManagerによって実装されています。私は状態を正しく変更しましたが、動作は変わっています。画面の向きでは、viewstate の後にcreateViewState()onNewViewStateInstance()が呼び出されます:viewstateと関連する動作の復元をキャンセルします。MvpViewStateFragmentが画面の向きにViewStateを復元しない

これはなぜ起こっているのでしょうか?

ViewStateをRestorableParcelableViewStateとして実装しましたが、同じことが起こります。

デバッグ後:onSaveInstanceState(fragment)、saveInstanceState(viewstate)、onViewCreated(f)、apply(vs)、[正しい動作だが、その後]、createViewState(f)、onCreate(f)、createPresenter f)、onViewCreated(f)そしてそこにあるすべてが再びnullになり、フラグメントがnull savedInstanceStateで作成されたかのように再起動します。ここで

がフラグメントの中核である:

public class DashboardFragment extends AuthViewStateFragment<DashboardView, 
     DashboardPresenter> implements WidgetHolderView, FragmentSupportBack, DashboardView { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
    } 

    @Override 
    protected void injectDependencies() { // called in onViewCreated 
    super.injectDependencies(); 
    presenter = new DashboardPresenter(dataService, getContext()); 
    } 

    @Override 
    public ViewState createViewState() { 
    return new DashboardViewState(); 
    } 

    @Override 
    public void onNewViewStateInstance() { 
    widgetManager.bindToWidgetHolderView(this, dashboardType, dashboardId); 
    presenter.onNewInstance(); 
    } 

    @Override 
    public DashboardPresenter createPresenter() { 
    return presenter; 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setAdapter(adapter); 
    } 

    @Override 
    public void showLoading() { 
    ((DashboardViewState) viewState).showSpinnerLoading(); 
    loadingView.setVisibility(View.VISIBLE); 
    } 

    @Override 
    public void showContent() { 
    ((DashboardViewState) viewState).showSpinner(); 
    adapter.notifyDataSetChanged(); 
    loadingView.setVisibility(View.GONE); 
    } 

    @Override 
    public void showError(String error) { 
    ((DashboardViewState) viewState).showSpinnerError(new Throwable(error)); 
    errorView.setVisibility(View.VISIBLE); 
    loadingView.setVisibility(View.GONE); 
    } 

    @Override 
    public void scrollList(List<Widget> widgets) { 
    ((DashboardViewState) viewState).showSpinner(); 
    ((DashboardViewState) viewState).setData(widgets, widgetManager.getFeeder()); 
    // scroll to widget 
    } 

    @Override 
    public void onStart() { 
    super.onStart(); 
    adapter.resubscribeWidgetToFeeder(); 
    } 

    @Override 
    public void onStop() { 
    adapter.unsubscribeWidgetFromFeeder(); 
    super.onStop(); 
    } 

    @Override 
    public void onDestroyView() { 
    adapter.flushReferencesToWidgetViews(); 
    super.onDestroyView(); 
    } 

    @Override 
    public void showSpinnerError(Throwable error) { 
    ((DashboardViewState) viewState).showSpinnerError(new Throwable(error)); 
    // show error 
    } 

    @Override 
    public void showSpinnerLoading() { 
    ((DashboardViewState) viewState).showSpinnerLoading(); 
    // Display loading icon for the spinner 
    } 

    @Override 
    public void setDashboardList(List<Dashboard> dashboardList) { 
    // Set DashboardList 
    this.dashboardList = dashboardList; 
    ((MainActivity)getActivity()).setDashboardList(dashboardList); 
    } 

    @Override 
    public void showSpinner() { 
    ((DashboardViewState) viewState).showSpinner(); 
    // show spinner 
    spinner.setOnItemSelectedListener(selectedListener); 
    setSelectedDatacenter(DatacenetrUtils.datacenterId); 
    } 

    @Override 
    public void setData(List<Widget> widgets, Feeder feeder) { 
    widgetManager.setWidgets(widgets); 
    widgetManager.setFeeder(feeder); 
    adapter.setFeeder(widgetManager.getFeeder()); 
    adapter.notifyDataSetChanged(); 
    } 
} 

ビューステート:

class DashboardViewState implements ViewState<DashboardView> { 
    private int state = LOADING; 
    private Throwable t; 
    private List<Widget> widgets; 
    private Feeder feeder; 

    @Override 
    public void apply(DashboardView view, boolean retained) { 
     switch (state) { 
      case LOADING: 
       view.showSpinnerLoading(); 
       break; 
      case CONTENT: 
       view.showSpinner(); 
       view.setData(widgets, feeder); 
       break; 
      case ERROR: 
       view.showSpinnerError(t); 
       break; 
     } 
    } 

    public void showSpinnerLoading() { 
     state = LOADING; 
    } 

    public void showSpinner() { 
     state = CONTENT; 
    } 

    public void setData(List<Widget> widgets, Feeder feeder) { 
     setWidgets(widgets); 
     setFeeder(feeder); 
    } 

    public void setWidgets(List<Widget> widgets) { 
     this.widgets = widgets; 
    } 

    public void setFeeder(Feeder feeder) { 
     this.feeder = feeder; 
    } 

    public void showSpinnerError(Throwable t) { 
     this.t = t; 
     state = ERROR; 
    } 
} 

プレゼンター:

public class DashboardPresenter 
     extends Mvp2RxPresenter<DashboardView, List<Dashboard>> { 
    private final DataService dataService; 
    private final Context context; 

    public DashboardPresenter(DataService dataService, Context context) { 
     this.dataService = dataService; 
     this.context = context; 
    } 

    public void onNewInstance() { 
     if (isViewAttached()) 
      getView().showSpinnerLoading(); 
     if (isViewAttached()) getView().showSpinnerLoading(); 
     subscribe(dataService.getDatacenters() 
         .concatMap(Observable::from) 
         .map(this::datacenterToDashboard) 
         .startWith(dataService.getCurrentUser() 
           .map(user -> { 
            Dashboard dashboard = new Dashboard (context.getString(R.string.dashboard_personalDashboard)); 
            return dashboard; 
           })) 
         .toList() 
       , 0); 
    } 


    @Override 
    protected void onNext(List<Dashboard> data, int pr) { 
     if (isViewAttached()) { 
      getView().setDashboardList(data); 
     } 
    } 

    @Override 
    protected void onError(Throwable e, int pr) { 
     if (isViewAttached()) getView().showSpinnerError(e); 
    } 

    @Override 
    protected void onCompleted(int pr) { 
     if (isViewAttached()) getView().showSpinner(); 
    } 
} 
+0

あなたはどのバージョンのmosbyを使用していますか?そのプロジェクトはオープンソースで作業しているので、具体的なコードを見ることができますか? – sockeqwe

+0

2.0.0しかし、私は2.0.1に改善しようとしました。 申し訳ありませんが、オープンソースではありません。しかし、あなたが探しているものが分かっていれば、私に尋ねるのをためらってください。まだ解決されていません。 – Kapouter

答えて

1

私はあなたが誤ってそれぞれに新しいDashboardFragmentを追加していると思いますアクティビティのオリエンテーションの変更はありますか?

元のフラグメントが復元された後、Fragment.onCreate()のようなログフラグメントライフサイクルイベントが再度呼び出されます。これは全く新しいDashboardFragmentを作成し、前のものと置き換えることを強く示しています。

あなたがような何かでください:あなたは、このような「活動を初めて開始した場合のフラグメントを追加」を持っている場合

class MyActivity extends Activity { 
    public void onCreate(Bundle saved){ 
     super.onCreate(saved); 
     if (saved == null)) 
      // Ensures that you only add one fragment the very first time the Activity starts 
      getSupportFragmentManager() 
       .beginTransaction() 
       .replace(R.id.container, new DashboardFragment()) 
       .commit(); 
     } 
    } 
} 

を確認してください。また、DashboardFragment.onCreateView()にブレークポイントを追加し、デバッガを起動してデバイスを回転させることもできます。 DashboardFragmentという2つの異なるインスタンスがあることがわかります。

+0

私は、フラグメントがアクティビティで復元され、再作成されないことを確認しました。しかし、実際には、実際には、フラグメントが再現されます。なぜ、どのようにしたらいいのかわかりません...結局、Mosbyに接続していないかもしれません。 – Kapouter

+0

Mosbyが内部的に 'FragmentManager'などを使用していないので、確かにそれがFragmentsを何らかの形で追加していないので、Mosbyが原因ではないと確信しています。 – sockeqwe

+0

情報ありがとうございました:) – Kapouter

関連する問題