Comment se fait l'information de position n'est pas passé à mon fragments?
-
21-12-2019 - |
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.
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));
}