0

我在此活動中有一個自定義的viewPagerAdapter,當第一次啓動活動時(當主要活動以意圖啓動它時)分頁器正確顯示片段,但是當我旋轉設備,配方是從savedInstantState中獲取的,並且適配器已啓動,但不會顯示碎片,並且getItem方法不會被調用!FragmentViewPagerAdapter在屏幕旋轉後不調用getItem

以下是活動代碼: package com.ameer.bake.activities;

import android.content.Intent; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.app.NavUtils; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.MenuItem; 
import android.view.ViewGroup; 

import com.ameer.bake.Constants; 
import com.ameer.bake.fragments.IngredientsFragment; 
import com.ameer.bake.fragments.StepDetailsFragment; 
import com.ameer.bake.fragments.StepsFragment; 
import com.ameer.bake.R; 
import com.ameer.bake.models.Recipe; 
import com.ameer.bake.models.Step; 
import com.google.gson.Gson; 
import com.ogaclejapan.smarttablayout.SmartTabLayout; 

public class DetailsActivity extends AppCompatActivity implements StepsFragment.StepCallback{ 

    private Recipe recipe; 
    private IngredientsFragment ingredientsFragment; 
    private StepsFragment stepsFragment; 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_details); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    if (savedInstanceState != null){ 
     recipe = new Gson().fromJson(savedInstanceState.getString(Constants.RECIPE), Recipe.class); 
     setupViewPager(); 
    } else if (getIntent().hasExtra(Constants.CURRENT_RECIPE_KEY)) { 
     Gson gson = new Gson(); 
     recipe = gson.fromJson(getIntent().getStringExtra(Constants.CURRENT_RECIPE_KEY), Recipe.class); 
     setTitle(recipe.getName()); 
     setupViewPager(); 
    } 

} 

@Override 
public void onStepClicked(Step step) { 
    Intent intent = new Intent(DetailsActivity.this, StepActivity.class); 
    intent.putExtra(Constants.STEP_KEY, new Gson().toJson(step)); 
    startActivity(intent); 
} 

private class RecipePagerAdapter extends FragmentPagerAdapter { 
    private static final int NUM_ITEMS = 2; 
    private final String[] titles = new String[]{ 
      getString(R.string.ingredients), getString(R.string.steps)}; 

    private RecipePagerAdapter(FragmentManager fragmentManager) { 
     super(fragmentManager); 
     if (ingredientsFragment == null && stepsFragment == null) { 
      ingredientsFragment = new IngredientsFragment(); 
      ingredientsFragment.setIngredients(recipe.getIngredients()); 
      stepsFragment = new StepsFragment(); 
      stepsFragment.setSteps(recipe.getSteps()); 
      stepsFragment.setCallback(DetailsActivity.this); 
     } 
    } 

    // Returns total number of pages 
    @Override 
    public int getCount() { 
     return NUM_ITEMS; 
    } 

    // Returns the fragment to display for that page 
    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       return ingredientsFragment; 
      case 1: 
       return stepsFragment; 
      default: 
       return null; 
     } 
    } 

    // Returns the page title for the top indicator 
    @Override 
    public CharSequence getPageTitle(int position) { 
     return titles[position]; 
    } 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == android.R.id.home){ 
     NavUtils.navigateUpFromSameTask(this); 
    } 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    savedInstanceState.putString(Constants.RECIPE, new Gson().toJson(recipe)); 
    super.onSaveInstanceState(savedInstanceState); 
} 

private void setupViewPager(){ 
    ViewPager vpPager = (ViewPager) findViewById(R.id.vpPager); 
    FragmentPagerAdapter pagerAdapter = new RecipePagerAdapter(getSupportFragmentManager()); 
    vpPager.setAdapter(pagerAdapter); 

    SmartTabLayout viewPagerTab = (SmartTabLayout) findViewById(R.id.viewpager_tab); 
    viewPagerTab.setViewPager(vpPager); 
} 

}

+0

首先嚐試使用onRestoreInstanceState –

+0

我試過這個,但它沒有任何區別。 –

+0

希望這個工程。 添加setRetainInstance(true);在onCreate你的內部片段查看頁面 「控制一個片段實例是否保留在Activity重新創建(例如從配置更改)。這隻能用於不在後端堆棧中的片段。如果設置,在重新創建活動時,片段生命週期會稍有不同「 –

回答

0

的解決方案是爲佩德羅·瓦雷拉在評論中提到: 「希望這個作品加入setRetainInstance(真);在視圖尋呼機的內部片段的onCreate」是否控制片段實例在Activity重新創建期間保留(例如從配置更改)。這隻能用於不在後端堆棧中的碎片。如果設置,則在重新創建活動時,片段生命週期將略有不同。「」 謝謝

0

切換到FragmentStatePagerAdapter而不是使用FragmentPagerAdapter。還可以使用getChildFragmentManager()而不是getSupportFragmentManager()

+0

我使用了FragmentStatePagerAdapter,但我不能使用getChildFragmentManager(),因爲它不能在FragmentActivities中使用,並且使用FragmentStatePagerAdapter沒有任何區別。 –