2011-09-10 2 views
1

J'essaie de faire une application simple basée sur l'API Android FragmentLayout. Au lieu de changer un simple TextView, je veux pouvoir basculer entre un groupe de classes que j'ai créé et qui étend la classe Fragment.Erreur lors du chargement dynamique des fragments dans l'application Android

Je peux créer statiquement n'importe lequel de mes exemples dans mon fichier layout.xml et le fragment fonctionne exactement comme je le souhaite. J'ai lu que vous ne pouvez pas remplacer les fragments qui ont été créés de cette façon, alors l'application exemple a semblé pertinente car elle charge dynamiquement le texte des détails. La principale différence est que je ne veux pas juste créer un nouveau fragment générique dans lequel je charge du texte à partir d'un fichier, je veux charger des fichiers de classe entiers (encore, qui sont eux-mêmes des Fragments et contiennent leurs propres SurfaveViews).

ici est ma mise en page

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 

    <fragment class="com.android.app.Examples$TitlesFragment" 
     android:id="@+id/titles" android:layout_weight="1" 
     android:layout_width="0px" android:layout_height="match_parent" /> 

    <FrameLayout android:id="@+id/fragment_to_switch_dynamically" android:layout_weight="1" 
     android:layout_width="0px" android:layout_height="match_parent" 
     android:background="?android:attr/detailsElementBackground" /> 

</LinearLayout> 

et voici les méthodes pertinentes de l'activité où je tente de créer et mettre à jour

void showDetails(int index) { 
     mCurCheckPosition = index; 

     if (mDualPane) { 
      // We can display everything in-place with fragments, so update 
      // the list to highlight the selected item and show the data. 
      getListView().setItemChecked(index, true); 

      if (mShownCheckPosition != mCurCheckPosition) { 
       // If we are not currently showing a fragment for the new 
       // position, we need to create and install a new one. 
       PApplet pa = getProcessingSketchByIndex(index); 

       // Execute a transaction, replacing any existing fragment 
       // with this one inside the frame. 
       FragmentTransaction ft = getFragmentManager() 
         .beginTransaction(); 
       ft.replace(R.id.processing, pa); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
       ft.commit(); 
       mShownCheckPosition = index; 
      } 

     } else { 
      // Otherwise we need to launch a new activity to display 
      // the dialog fragment with selected text. 
      // Intent intent = new Intent(); 
      // intent.setClass(getActivity(), DetailsActivity.class); 
      // intent.putExtra("index", index); 
      // startActivity(intent); 
     } 
    } 

    private PApplet getProcessingSketchByIndex(int index) { 
     PApplet pa = null; 
     switch (index) { 
     case 0: 
      pa = new Lights1(); 
      break; 
     case 1: 
      pa = new Lights2(); 
      break; 
     case 2: 
      pa = new Reflection(); 
      break; 
     case 3: 
      pa = new Rotate(); 
      break; 
     case 4: 
      pa = new Spot(); 
      break; 
     case 5: 
      break; 
     default: 
      break; 
     } 
     return pa; 
    } 
} 

Tout semble aller bien, puis-je obtenir cette erreur :

E/AndroidRuntime(31393): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.processing.app/com.android.processing.app.ProcessingExamples}: java.lang.IllegalArgumentException: No view found for id 0x7f050001 for fragment Lights1{407bf678 #1 id=0x7f050001} 
    E/AndroidRuntime(31393): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815) 
    E/AndroidRuntime(31393): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831) 
    E/AndroidRuntime(31393): at android.app.ActivityThread.access$500(ActivityThread.java:122) 
    E/AndroidRuntime(31393): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024) 
    E/AndroidRuntime(31393): at android.os.Handler.dispatchMessage(Handler.java:99) 
    E/AndroidRuntime(31393): at android.os.Looper.loop(Looper.java:132) 
    E/AndroidRuntime(31393): at android.app.ActivityThread.main(ActivityThread.java:4123) 
    E/AndroidRuntime(31393): at java.lang.reflect.Method.invokeNative(Native Method) 
    E/AndroidRuntime(31393): at java.lang.reflect.Method.invoke(Method.java:491) 
    E/AndroidRuntime(31393): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
    E/AndroidRuntime(31393): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
    E/AndroidRuntime(31393): at dalvik.system.NativeStart.main(Native Method) 
    E/AndroidRuntime(31393): Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f050001 for fragment Lights1{407bf678 #1 id=0x7f050001} 
    E/AndroidRuntime(31393): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:770) 
    E/AndroidRuntime(31393): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:977) 
    E/AndroidRuntime(31393): at android.app.BackStackRecord.run(BackStackRecord.java:638) 
    E/AndroidRuntime(31393): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1309) 
    E/AndroidRuntime(31393): at android.app.Activity.performStart(Activity.java:4406) 
    E/AndroidRuntime(31393): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1788) 
    E/AndroidRuntime(31393): ... 11 more 

merci d'avance pour toute aide

+0

Où est votre code Lights1? On dirait que vous devez passer un argument. – doNotCheckMyBlog

Répondre

1

Peut-être parce que 'R.id.processing' n'existe pas dans le XML de la vue.

Dans votre XML je vois

<FrameLayout android:id="@+id/fragment_to_switch_dynamically"> 

Alors peut-être changer R.id.processing à R.id.fragment_to_switch_dynamically?

Questions connexes