Question

J'ai un Activity c'est en grande partie une forme non modifiée par défaut d'Android Studio exemple pour un des onglets de l'activité.Son FragmentPagerAdapter est modifiée afin d'afficher toutes les 50 États-unis, avec 50 onglets correspondants de l'affichage de leurs noms.Cela fonctionne jusqu'à ce qu'un fragment est détruit, mais quand il est re-créé, il n'est pas dit de quel onglet, c'est sur.Pourquoi est-ce arrivé?

Voici toutes les méthodes que je pense pourrait être une partie du problème:

public class MainQuizActivity extends Activity implements ActionBar.TabListener {

    ...

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        ...

        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a PlaceholderFragment (defined as a static inner class below).
            return
                questionFragments[position] == null
                    ? questionFragments[position] = QuestionFragment.newInstance(position)
                    : questionFragments[position];
        }

        ...
    }

    ...
}

...

public class QuestionFragment extends Fragment {

    ...

    public static QuestionFragment newInstance(int stateIndex) {
        System.out.println("Creating new instance for state #" + stateIndex);
        QuestionFragment fragment = new QuestionFragment();
        Bundle args = new Bundle();
        args.putInt(States.BUNDLE_KEY, stateIndex);
        fragment.setArguments(args);
        return fragment;
    }

    ...

    @Override
    public View onCreateView(
        LayoutInflater inflater,
        ViewGroup container,
        Bundle savedInstanceState) {
        System.out.println("~onCreateView");
        View rootView = inflater.inflate(
            R.layout.fragment_main_quiz, container, false);

        webView = (WebView)rootView.findViewById(R.id.webView);
        initState(savedInstanceState);

        return rootView;
    }

    private void initState(Bundle args) {
        if (state == null) {
            System.out.println("Bundle: " + args);
            if (args == null)
                args = getArguments();
            System.out.println("Bundle is now: " + args);
            int stateIndex = args.getInt(States.BUNDLE_KEY);
            System.out.println("Gonna be state #" + stateIndex);
            state = States.values()[stateIndex];
            System.out.println("Gonna be " + state);
        }
        else
            System.out.println("State already exists! (yay!)");

        String path = state.getImageURL();
        System.out.println("Opening image at " + path);

        webView.loadUrl(path);
        webView.setBackgroundColor(0x00000000);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        System.out.println("~onCreate");
        super.onCreate(savedInstanceState);
        if (webView == null)
            webView = (WebView)(getActivity().findViewById(R.id.webView));
        System.out.println("onCreate: webView == " + webView);
        System.out.println("onCreate: bundle == " + savedInstanceState);

        if (webView != null
            && savedInstanceState != null)
        initState(savedInstanceState);
    }

    ...

}

J'ai sauvé ce dans le bundle avec la clé States.BUNDLE_KEY (ce qui est "STATE"), mais le bundle il n'a pas que la clé en elle la deuxième fois.À des fins de débogage, j'ai remplacé tous les on* les méthodes qui traitent de chargement et de déchargement avec vide comme:

@Override public void onResume(){
    System.out.println("~onResume");
    super.onResume();}

Bien sûr, il ya aussi plus de sorties de débogage que j'ai jeté dans.

J'espère que ce vidéo J'ai enregistré aide à illustrer le problème: http://youtu.be/cmbR_2rvpX4

L' console de vidage pour la vidéo, c'est dans ce pastebin: http://pastebin.com/rxAP7qda

Et, si tout cela ne fonctionne toujours pas, voici son git: https://github.com/Supuhstar/US-State-Quiz-App


Même après tout cela, je sens que je ne suis pas de donner la bonne information.Veuillez demander moins ou plus si vous pensez que cela peut être mieux.

Était-ce utile?

La solution

Vous n'êtes pas initialiser les choses correctement dans votre QuestionFragment.Tout d'abord il n'y a pas besoin d'appeler la initState(savedInstanceState); la méthode dans le onCreate() et onCreateView() les rappels.L'appeler en onCreateView() et de supprimer entièrement l' onCreate() méthode:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    System.out.println("~onCreateView");
    View rootView = inflater.inflate(R.layout.fragment_main_quiz, container, false);

    webView = (WebView)rootView.findViewById(R.id.webView);
    guessSpinner = (Spinner)getActivity().findViewById(R.id.guess_spinner);
    initState();
    initGuesser();
    return rootView;
}

Votre initState(savedInstanceState) la méthode est aussi un peu trop compliqué pour ce qu'il doit faire:

private void initState() {
     Bundle args = getArguments();
     if (args == null) {
        throw new IllegalArgumentException("The arguments should be valid!");
     }
     System.out.println("Bundle is now: " + args);
     int stateIndex = args.getInt(States.BUNDLE_KEY); 
     System.out.println("Gonna be state #" + stateIndex);
     state = States.values()[stateIndex];
     System.out.println("Gonna be " + state);
     String path = state.getImageURL();
     System.out.println("Opening image at " + path);

     webView.loadUrl(path);
     webView.setBackgroundColor(getResources().getColor(R.color.transparent));
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top