0

Ich habe einen benutzerdefinierten ViewPagerAdapter in dieser Aktivität, wenn der erste Start der Aktivität (Wenn die Hauptaktivität es mit der Absicht startet) der Pager zeigt die Fragmente korrekt, aber wenn ich das Gerät drehen , das Rezept stammt von savedInstantState und der Adapter wird gestartet, aber die Fragmente werden nicht angezeigt und die Methode getItem wird nicht aufgerufen!FragmentViewPagerAdapter ruft getItem nicht nach Bildschirmrotation

Hier ist der Code für die Aktivität: Paket 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

Zuerst versuchen onRestoreInstanceState zu verwenden –

+0

Ich habe das versucht, aber es macht keinen Unterschied. –

+0

Hoffe, das funktioniert. Hinzufügen setRetainInstance (true); in onCreate Ihrer internen Fragmente der Ansicht Pager "Steuern, ob eine Fragment-Instanz über Aktivität neu erstellt wird (wie von einer Konfigurationsänderung). Dies kann nur mit Fragmenten nicht im Backstack verwendet werden. Wenn gesetzt, der Fragmentlebenszyklus wird sich geringfügig unterscheiden, wenn eine Aktivität neu erstellt wird " –

Antwort

0

Die Lösung wurde als Pedro Varela in den Kommentaren erwähnt: "Ich hoffe, das funktioniert hinzufügen setRetainInstance (true); in onCreate Ihrer internen Fragmente der Ansicht Pager" Control ob Eine Fragmentinstanz bleibt bei der Neuerstellung von Aktivitäten erhalten (z. B. bei einer Konfigurationsänderung). Dies kann nur mit Fragmenten verwendet werden, die nicht im Backstack sind. Wenn gesetzt, wird der Fragmentlebenszyklus etwas anders aussehen, wenn eine Aktivität neu erstellt wird. " Danke

0

Wechseln Sie zu einem FragmentStatePagerAdapter statt FragmentPagerAdapter verwenden. Verwenden Sie auch getChildFragmentManager() anstelle von getSupportFragmentManager()

+0

Ich habe den FragmentStatePagerAdapter verwendet, aber ich kann getChildFragmentManager() nicht verwenden, da er nicht in FragmentActivities verwendet werden kann und die Verwendung von FragmentStatePagerAdapter keinen Unterschied macht. –

Verwandte Themen