0

이 액티비티에서 사용자 정의 viewPagerAdapter가 있는데, 액티비티를 처음 실행할 때 (기본 액티비티가 의도와 함께 시작될 때) 페이저에 조각이 올바르게 표시되지만 장치를 회전하면 , recipe가 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); 
} 

} 오히려 FragmentPagerAdapter를 사용하는 것보다 FragmentStatePagerAdapter에

+0

먼저 onRestoreInstanceState를 사용하려고합니다. –

+0

시도했지만 어떤 차이가 없습니다. –

+0

희망이 있습니다. 추가 setRetainInstance (true)를 추가하십시오. on viewpager의 내부 프래그먼트를 생성합니다. "프래그먼트 인스턴스가 작업 재 작성 (예 : 구성 변경)에서 유지되는지 여부를 제어합니다. 이것은 백 스택에없는 프래그먼트에서만 사용할 수 있습니다. 활동이 재현 될 때 프래그먼트 수명주기가 약간 달라집니다. " –

답변

0

솔루션이었다에서 getSupportFragmentManager()의) getChildFragmentManager를 (사용 는, 제어 여부 ".이 작품 희망 setRetainInstance (true)를 추가 뷰 호출기의 내부 조각에서 onCreate에서" 프래그먼트 인스턴스는 활동 재 작성 (예 : 구성 변경)에서 유지됩니다. 이것은 백 스택에없는 조각에서만 사용할 수 있습니다. 설정하면 활동이 다시 생성 될 때 조각 라이프 사이클이 약간 달라집니다. "" 감사합니다.

0

전환합니다. 또한 대신 페드로 바렐라가 코멘트에 언급 한 바와 같이

+0

FragmentStatePagerAdapter를 사용했지만 FragmentActivities에서 사용할 수 없기 때문에 getChildFragmentManager()를 사용하지 않으며 FragmentStatePagerAdapter를 사용하여 어떤 차이도 만들지 않았기 때문에 사용할 수 없습니다. –