Je déteste poster du code et demander pourquoi ça ne marche pas, mais je ne sais pas quoi faire pour l'instant. J'ai essayé d'exécuter la classe ci-dessous, et j'obtiens une exception dans logcat que je ne peux pas expliquer. Même une recherche sur Google donne peu de résultats. Peut-être que je ne comprends pas l'écosystème, mais l'exception contient peu d'informations. L'exception que je reçois est la suivante :
03-06 21:50:43.031: E/AndroidRuntime(1013): FATAL EXCEPTION: main
03-06 21:50:43.031: E/AndroidRuntime(1013): android.content.res.Resources$NotFoundException: Unable to find resource ID #0xffffffff
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.content.res.Resources.getResourceName(Resources.java:1659)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:903)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.support.v4.view.ViewPager.populate(ViewPager.java:1012)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.support.v4.view.ViewPager.populate(ViewPager.java:881)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1366)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.view.View.measure(View.java:15513)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.view.View.measure(View.java:15513)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.view.View.measure(View.java:15513)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
03-06 21:50:43.031: E/AndroidRuntime(1013): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.view.View.measure(View.java:15513)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.view.Choreographer.doCallbacks(Choreographer.java:562)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.view.Choreographer.doFrame(Choreographer.java:532)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.os.Handler.handleCallback(Handler.java:725)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.os.Handler.dispatchMessage(Handler.java:92)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.os.Looper.loop(Looper.java:137)
03-06 21:50:43.031: E/AndroidRuntime(1013): at android.app.ActivityThread.main(ActivityThread.java:5039)
03-06 21:50:43.031: E/AndroidRuntime(1013): at java.lang.reflect.Method.invokeNative(Native Method)
03-06 21:50:43.031: E/AndroidRuntime(1013): at java.lang.reflect.Method.invoke(Method.java:511)
03-06 21:50:43.031: E/AndroidRuntime(1013): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-06 21:50:43.031: E/AndroidRuntime(1013): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-06 21:50:43.031: E/AndroidRuntime(1013): at dalvik.system.NativeStart.main(Native Method)
03-06 21:55:44.231: E/Trace(1033): error opening trace file: No such file or directory (2)
J'ai essayé de déplacer le ViewPager vers le contenu de niveau supérieur (c'est-à-dire setContent( pager )) mais cela ne semble pas fonctionner. Toute contribution est la bienvenue. Le code est ci-dessous :
EDIT* J'ai simplifié l'exemple, et j'ai toujours le même problème.
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;
public class AskQuestionActivity extends FragmentActivity
{
private static LayoutParams MATCH_PARENT = new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT );
@Override
protected void onCreate( Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
ViewPager pager = new ViewPager( this );
pager.setAdapter( new FragmentPagerAdapter( getSupportFragmentManager() )
{
@Override
public int getCount()
{
return 1;
}
@Override
public Fragment getItem( int arg0 )
{
return new BoardFragment();
}
} );
setContentView( pager );
}
public static class BoardFragment extends Fragment
{
@Override
public View onCreateView( LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState )
{
TextView textView = new TextView( getActivity() );
textView.setText( "Board" );
textView.setGravity( Gravity.CENTER );
LinearLayout layout = new LinearLayout( getActivity() );
layout.setLayoutParams( MATCH_PARENT );
layout.addView( textView );
return layout;
}
}
}
Toute aide est la bienvenue.
0 votes
Je ne pense pas que le problème soit dans le code que vous avez montré. Avez-vous des fichiers de mise en page XML que vous utilisez ?
0 votes
Non, pas dans ce cas. Sauf si mon manifeste s'avère utile (je sais, je debe Je vais probablement mettre mes mises en page en XML, mais je m'amuse juste avec quelques trucs). Pendant une seconde, j'ai pensé que c'était peut-être parce que je n'avais pas donné de taille à mon viewpager en appelant pager.setLayoutParam( params ) ; mais cela n'a pas fait l'affaire non plus.
1 votes
Quelque chose est traité comme une ressource alors qu'il devrait être traité comme une couleur. La chose que je vois, cependant, est que vous n'avez pas de ressources référencées dans ce code. (Je pense, quelque part,
0xFFFFFFFF
est utilisé à la place deandroid.R.color.white
ou similaire). La raison pour laquelle j'ai suggéré XML est que la trace de la pile ne renvoie pas à votre code, mais elle peut provenir d'une auto-inflation de fragment ou autre.0 votes
J'ai en fait une théorie différente, je pense que l'instanciation d'un ViewPager comme je l'ai fait entraîne le problème (PS, j'ai mis à jour l'exemple pour qu'il soit un peu plus simple). J'ai l'impression que le FragmentManager suppose qu'un ViewPager sera toujours dans un layout xml et non passé par programme (comme je l'ai fait). Je vais essayer de créer un fichier layout et voir si cela fonctionne.
0 votes
Ce serait très étrange, car j'ai une application qui instancie le fichier
ViewPager
de manière programmatique également. Je n'ai jamais eu un tel problème auparavant.0 votes
Ok, voilà mes dernières observations. J'aimerais en savoir plus sur les rouages d'Android pour expliquer ce que je vois, mais c'est ainsi. En mettant le ViewPager dans un XML seul, j'obtiens des erreurs (unbound prefix.. ??), envelopper le ViewPager dans un LinearLayout et ensuite obtenir le ViewPager en utilisant findViewById semble résoudre mon problème. Peut-être que ce qui précède présente quelques problèmes, le premier étant que le ViewPager ne peut pas être ajouté en tant que vue de niveau supérieur (il doit être une vue enfant d'un groupe de vues), le second étant qu'il doit peut-être avoir un ID ? C'est peut-être ce qu'attend le FragmentManager ?
0 votes
Un préfixe non lié signifie que vous n'avez pas inclus l'option
xmlns:android="..."
dans votreViewPager
(ce sera avec votreLinearLayout
cependant).0 votes
Vous avez raison. Ignorez mon commentaire sur la nécessité d'un parent. Cependant, je n'arrive toujours pas à le faire fonctionner en instanciant le view pager de manière programmatique, par contre, le faire via XML semble fonctionner.
0 votes
C'est bizarre. Je ne sais vraiment pas pourquoi.
2 votes
Ok, non pas que je veuille perpétuer une mauvaise pratique, mais je viens d'ajouter cette ligne au code pager.setId( 453543 ) ; et cela semble fonctionner donc peut-être que ma théorie sur le besoin d'un ID est la bonne ? Je ne sais pas.
0 votes
Ce problème est probablement lié au type d'adaptateur que vous liez à votre ViewPager. J'ai exactement le même problème depuis que j'ai commencé à utiliser un FragmentStatePagerAdapter au lieu d'une simple sous-classe de PagerAdapter. Je vais maintenant essayer d'inclure le ViewPager par layout xml. Merci !
0 votes
Le réglage de l'ID a fonctionné pour moi.