2011-11-26 3 views
4

Je pensais que ma conversion en fragments assez bien fait jusqu'à ce que j'ai fait pivoter l'écran. Je reçois les types d'erreurs suivants:Android Re-Instantiation erreur de fragment

RuntimeException: Impossible de démarrer l'activité ComponentInfo {com.ghcssoftware.gedstar/com.ghcssoftware.gedstar.GedStar}: android.support.v4.app.Fragment $ InstantiationException: Impossible de instancier le fragment com.ghcssoftware.gedstar.PersonTab $ PersonTabFrag: assurez-vous que le nom de la classe existe, est public, et a un constructeur vide qui est public

La classe en question existe, est public, et j'ai ajouté un constructeur vide avec pas de changement dans les résultats. En regardant un exemple de code, je remarque quelques différences dans la façon dont mon code est écrit, bien que je ne vois pas de constructeurs vides non plus:

1) Y a-t-il une raison pour que ma classe de fragments soit déclarée "statique" de nombreux échantillons sont?

2) Dois-je implémenter l'utilisation de "newInstance" dans ma classe de fragments? Pourquoi cela est-il fait au lieu de simplement avoir un constructeur? Par exemple de l'un des échantillons de V14:

public static class CountingFragment extends Fragment { 
    int mNum; 

    /** 
    * Create a new instance of CountingFragment, providing "num" 
    * as an argument. 
    */ 
    static CountingFragment newInstance(int num) { 
     CountingFragment f = new CountingFragment(); 

     // Supply num input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("num", num); 
     f.setArguments(args); 

     return f; 
    } 

Je suis encore un peu familier avec certains concepts de Java, donc peuvent être manque ici quelque chose de base.

Doug Gordon GHCS Software

+0

Je ne suis pas sûr de ce qui se passe avec votre problème de rotation, mais cette page décrit le but de la déclaration de classe statique: http://www.javaworld.com/javaworld/javaqa/1999-08/01-qa-static2.html – goto10

Répondre

4

Y at-il raison que ma classe de fragment doit être déclarée "statique" que de nombreux échantillons sont?

Seulement si c'est une classe interne de quelque chose. Puisque le vôtre semble être une classe interne de PersonTab, il devra être statique. Ou, déplacez-le en dehors de PersonTab pour devenir une classe Java autonome. Dois-je implémenter l'utilisation de "newInstance" dans ma classe de fragment?

Pourquoi cela est-il fait au lieu de simplement avoir un constructeur?

C'est juste une méthode d'usine. Ce n'est pas requis par le cadre.

+0

Vous cherchez un petit éclaircissement: lorsque je fais tourner l'écran avec l'application en cours, mon activité est "redémarrée" - correct? Alors, qui essaie d'instancier ma classe de fragments? Au premier démarrage, mon activité crée elle-même l'objet et l'ajoute à sa vue conteneur. Ne le ferait-il pas simplement après la rotation? Et alors pourquoi cela échouerait-il? Quelle est la différence? – gordonwd

+0

@gordonwd: "Alors, qui essaie d'instancier ma classe de fragments?" - Je ne peux pas répondre à cette question, car vous n'avez pas indiqué si ceci est mis en place via '' ou un 'FragmentTransaction'. "Ne le ferait-il pas simplement après la rotation?" -- Oui. "Et alors pourquoi ça échouerait - quelle est la différence?" -- il n'y a pas de différence. S'il vous plaît comprendre que nous ne sommes pas des lecteurs d'esprit. Nous ne pouvons que passer par les preuves que vous fournissez.Votre preuve indique que vous avez une faille dans votre déclaration de classe de fragment, comme je l'ai noté dans ma réponse. – CommonsWare

+0

Désolé, Mark - Je m'en rends compte. Même si je suppose que je sais comment résoudre ce problème, je voudrais comprendre ce qui se passe un peu mieux, alors je pense que je vais mettre quelques points d'arrêt afin que je puisse voir à quel point les choses vont mal (avant de faire le " réparer"). Mes fragments sont tous ajoutés par des transactions, BTW. J'ai une application existante assez complexe et essayait de prendre quelques raccourcis pour la rendre fragmentaire, mais vous savez comment ça se passe ... – gordonwd

0

2). Passer un argument de fonction newInstance variable throw, dans le cas où c'est num, permet d'exclure une variable privée de classe qui devait amener une valeur entre constractor et onCreateView. Pour int variable, il n'y a rien, mais pour la chaîne longue ... regards, yury

Questions connexes