0

このアクティビティにカスタムviewPagerAdapterがあります。このアクティビティの最初の起動時(メインアクティビティでインテントで開始されたとき)、ページャはフラグメントを正しく表示しますが、レシピはsavedInstantStateから取得され、アダプタは起動されますが、フラグメントは表示されず、getItemメソッドはコールされません。FragmentViewPagerAdapterが画面回転後にgetItemを呼び出さない

アクティビティのコードは次のとおりです。 パッケージcom.ameer.bake.activities;むしろFragmentPagerAdapterを使用するよりFragmentStatePagerAdapterに

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) "フラグメントのインスタンスがアクティビティの再作成(構成の変更など)全体で保持されるかどうかを制御します。これはバックスタックにないフラグメントでのみ使用できます。アクティビティが再作成されると、フラグメントのライフサイクルはわずかに異なります。 " –

答えて

0

ソリューションでした使用: は、コントロールかどうか「この作品を願ってsetRetainInstance(真)を追加し、ビューポケットベルの内部フラグメントののonCreateで。」フラグメントのインスタンスは、アクティビティの再作成(コンフィグレーションの変更など)全体で保持されます。これは、バックスタックにないフラグメントでのみ使用できます。もし設定されていれば、アクティビティが再作成されたときのフラグメントのライフサイクルは若干異なります。 " ありがとう

0

スイッチ。また、ペドロバレラはコメントで述べたようにgetChildFragmentManager()の代わりに、getSupportFragmentManager()

+0

私はFragmentStatePagerAdapterを使用しましたが、FragmentActivitiesで使用することができず、FragmentStatePagerAdapterを使用しても違いがないため、getChildFragmentManager()を使用しません。 –

関連する問題