2012-02-20 3 views
3

Je suis en train d'obtenir imbriqués viewflippers mis en place avec la configuration suivanteNested ViewFlipper

Top_ViewFlipper 
- Type 1 
    Sub_ViewFlipper 
    - SubType 1 
    - SubType 2 
    - SubType 3 
- Type 2 
    Sub_ViewFlipper 
    - SubType 1 
    - SubType 2 
    - SubType 3 

Source se trouve ici: https://github.com/platinummonkey/TXLF-App/tree/master/android Les liens suivants contiennent tous les XML et source pertinente à ce problème (au lieu de l'affichage un mur de texte):

Trace d'erreur actuel:

--------- beginning of /dev/log/main 
--------- beginning of /dev/log/system 
D/KeyguardViewMediator( 981): wakeWhenReadyLocked(26) 
I/power ( 981): *** set_screen_state 1 
V/$$$$$$ (8060): In Method: ACTION_SCREEN_ON 
V/$$$$$$ (8060): In service onStart: REGISTERED RECEIVER 
D/SurfaceFlinger( 981): Screen about to return, flinger = 0x95b38 
V/$$$$$$ (8060): In Method: ACTION_USER_PRESENT 
I/ActivityManager( 981): Start proc com.android.settings for broadcast com.android.settings/.widget.SettingsAppWidgetProvider: pid=8945 uid=1000 gids={1015, 3002, 3001, 3003} 
W/InputManagerService( 981): Window already focused, ignoring focus gain of: [email protected] 
D/szipinf (8945): Initializing inflate state 
V/$$$$$$ (8060): In service onStart: REGISTERED RECEIVER 
D/szipinf (8945): Initializing inflate state 
D/SettingsAppWidgetProvider(8945): Widget is from a previous version... Let's update 
D/SettingsAppWidgetProvider(8945): No instances yet... Wait for at least one instance to exist before adding global settings 
I/ActivityManager( 981): No longer want com.anod.calendar (pid 8541): hidden #16 
W/ActivityManager( 981): Scheduling restart of crashed service com.anod.calendar/.services.UpdateService in 5000ms 
I/ActivityManager( 981): Start proc com.anod.calendar for service com.anod.calendar/.services.UpdateService: pid=8953 uid=10083 gids={1015} 
D/dalvikvm( 967): GC_EXPLICIT freed 12K, 51% free 2674K/5379K, external 0K/0K, paused 133ms 
D/szipinf (8953): Initializing inflate state 
I/ActivityThread(8953): Pub com.anod.calendar.events.provider: com.anod.calendar.scrollable.ScrollableDataProvider 
I/dalvikvm(8953): Could not find method android.appwidget.AppWidgetManager.notifyAppWidgetViewDataChanged, referenced from method com.anod.calendar.services.UpdateService.updateWidgets 
D/dalvikvm( 967): GC_EXPLICIT freed <1K, 51% free 2674K/5379K, external 0K/0K, paused 63ms 
W/dalvikvm(8953): VFY: unable to resolve virtual method 151: Landroid/appwidget/AppWidgetManager;.notifyAppWidgetViewDataChanged ([II)V 
D/dalvikvm(8953): VFY: replacing opcode 0x6e at 0x0024 
D/SimpleCal(8953): Register content observer : 0 
D/SimpleCal(8953): Unregister content observer : 1 
D/SimpleCal(8953): Unregister content observer : 2 
D/dalvikvm( 967): GC_EXPLICIT freed <1K, 51% free 2674K/5379K, external 0K/0K, paused 45ms 
D/SimpleCal(8953): Register content observer : 0 
D/SimpleCal(8953): Unregister content observer : 1 
D/SimpleCal(8953): Unregister content observer : 2 
D/AndroidRuntime(8964): 
D/AndroidRuntime(8964): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<< 
I/AndroidRuntime(8964): Heap size: -Xmx32m 
D/AndroidRuntime(8964): CheckJNI is OFF 
D/dalvikvm(8964): creating instr width table 
D/AndroidRuntime(8964): Calling main entry com.android.commands.pm.Pm 
D/AndroidRuntime(8964): Shutting down VM 
D/dalvikvm(8964): GC_CONCURRENT freed 103K, 70% free 307K/1024K, external 0K/0K, paused 0ms+1ms 
D/dalvikvm(8964): Debugger has detached; object registry had 1 entries 
I/AndroidRuntime(8964): NOTE: attach of thread 'Binder Thread #3' failed 
D/AndroidRuntime(8974): 
D/AndroidRuntime(8974): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<< 
I/AndroidRuntime(8974): Heap size: -Xmx32m 
D/AndroidRuntime(8974): CheckJNI is OFF 
D/dalvikvm(8974): creating instr width table 
D/AndroidRuntime(8974): Calling main entry com.android.commands.am.Am 
I/ActivityManager( 981): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=org.texaslinuxfest.txlf/.TxlfActivity } from pid 8974 
I/ActivityManager( 981): Start proc org.texaslinuxfest.txlf for activity org.texaslinuxfest.txlf/.TxlfActivity: pid=8982 uid=10100 gids={3003, 1006} 
D/AndroidRuntime(8974): Shutting down VM 
D/dalvikvm(8974): GC_CONCURRENT freed 103K, 69% free 325K/1024K, external 0K/0K, paused 0ms+1ms 
D/dalvikvm(8974): Debugger has detached; object registry had 1 entries 
I/AndroidRuntime(8974): NOTE: attach of thread 'Binder Thread #3' failed 
E/jdwp (8982): Failed sending reply to debugger: Broken pipe 
D/dalvikvm(8982): Debugger has detached; object registry had 1 entries 
D/szipinf (8982): Initializing inflate state 
D/dalvikvm(8982): GC_EXTERNAL_ALLOC freed 44K, 50% free 2692K/5379K, external 0K/0K, paused 56ms 
V/txlf (8982): App already installed on your phone 
D/txlf (8982): Guide hasn't expired 
V/txlf (8982): Guide is ready - Sessions available 
I/ActivityManager( 981): Displayed org.texaslinuxfest.txlf/.TxlfActivity: +406ms (total +4m46s12ms) 
V/$$$$$$ (8060): In service onStart: REGISTERED RECEIVER 
I/ActivityManager( 981): Starting: Intent { cmp=org.texaslinuxfest.txlf/.Sessions (has extras) } from pid 8982 
D/Sessions Activity(8982): Got guide through intent Serializable 
W/ResourceType(8982): getEntry failing because entryIndex 12 is beyond type entryCount 12 
W/ResourceType(8982): Failure getting entry for 0x7f03000c (t=2 e=12) in package 0 (error -2147483647) 
D/AndroidRuntime(8982): Shutting down VM 
W/dalvikvm(8982): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
E/AndroidRuntime(8982): FATAL EXCEPTION: main 
E/AndroidRuntime(8982): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.texaslinuxfest.txlf/org.texaslinuxfest.txlf.Sessions}: android.content.res.Resources$NotFoundException: Resource ID #0x7f03000c 
E/AndroidRuntime(8982): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768) 
E/AndroidRuntime(8982): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 
E/AndroidRuntime(8982): at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
E/AndroidRuntime(8982): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
E/AndroidRuntime(8982): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(8982): at android.os.Looper.loop(Looper.java:130) 
E/AndroidRuntime(8982): at android.app.ActivityThread.main(ActivityThread.java:3835) 
E/AndroidRuntime(8982): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(8982): at java.lang.reflect.Method.invoke(Method.java:507) 
E/AndroidRuntime(8982): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
E/AndroidRuntime(8982): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
E/AndroidRuntime(8982): at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(8982): Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f03000c 
E/AndroidRuntime(8982): at android.content.res.Resources.getValue(Resources.java:929) 
E/AndroidRuntime(8982): at android.content.res.Resources.loadXmlResourceParser(Resources.java:1955) 
E/AndroidRuntime(8982): at android.content.res.Resources.getLayout(Resources.java:768) 
E/AndroidRuntime(8982): at android.view.LayoutInflater.inflate(LayoutInflater.java:318) 
E/AndroidRuntime(8982): at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
E/AndroidRuntime(8982): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:212) 
E/AndroidRuntime(8982): at android.app.Activity.setContentView(Activity.java:1657) 
E/AndroidRuntime(8982): at org.texaslinuxfest.txlf.Sessions.onCreate(Sessions.java:70) 
E/AndroidRuntime(8982): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
E/AndroidRuntime(8982): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722) 
E/AndroidRuntime(8982): ... 11 more 
W/ActivityManager( 981): Force finishing activity org.texaslinuxfest.txlf/.Sessions 
W/ActivityManager( 981): Force finishing activity org.texaslinuxfest.txlf/.TxlfActivity 
W/ActivityManager( 981): Activity pause timeout for HistoryRecord{40708c48 org.texaslinuxfest.txlf/.Sessions} 
I/ActivityManager( 981): No longer want com.android.defcontainer (pid 8900): hidden #16 
I/Process (8982): Sending signal. PID: 8982 SIG: 9 
I/ActivityManager( 981): Process org.texaslinuxfest.txlf (pid 8982) has died. 
I/WindowManager( 981): WIN DEATH: Window{407c4aa8 org.texaslinuxfest.txlf/org.texaslinuxfest.txlf.TxlfActivity paused=true} 
D/dalvikvm( 981): GC_CONCURRENT freed 1979K, 51% free 7640K/15431K, external 3673K/3889K, paused 12ms+11ms 

Actuellement, il seulement les erreurs dues, deux commits avant que j'avais une primaire Viewflipper fonctionne, mais l'imbriquer semble s d'avoir des choses cassées ... même après avoir ajouté manuellement des vues de liste au viewflipper imbriqué (au lieu d'utiliser une méthode générique). Je n'arrive pas à assigner les sous-types au subViewflipper approprié. Quelqu'un at-il un exemple de ce soit XML ou par programme? Je n'ai pas encore trouvé d'exemples sur l'utilisation de viewflippers imbriqués. En option, l'hôte de l'onglet peut fonctionner, mais je préférerais les boutons en mode texte et j'aime les animations fournies avec viewflipper.

+0

Je me suis installé avec un TabHost + Viewflippers. – platinummonkey

+0

Nouvelle question déplacée à: http://stackoverflow.com/questions/9456603/tabhost-with-multiple-viewflippers-gesturelistener – platinummonkey

Répondre

1

repo GitHub: https://github.com/agoransson/nested_view_flippers

D'accord, ce sera une grande réponse ... mais j'espère que c'est ce que vous recherchez.

L'activité:

private GestureDetector gestureScanner; 
private ViewFlipper rootFlipper; 
private ViewFlipper flipper1, flipper2; 

private Animation animFlipInNext, animFlipOutNext; 
private Animation animFlipInPrevious, animFlipOutPrevious; 
private Animation rootAnimFlipInNext, rootAnimFlipOutNext; 
private Animation rootAnimFlipInPrevious, rootAnimFlipOutPrevious; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // Root flipper 
    rootFlipper = (ViewFlipper) findViewById(R.id.rootFlipper); 

    // Content flippers 
    flipper1 = (ViewFlipper) findViewById(R.id.viewFlipper1); 
    flipper2 = (ViewFlipper) findViewById(R.id.viewFlipper2); 

    gestureScanner = new GestureDetector(this); 

    // Animations 
    animFlipInNext = AnimationUtils.loadAnimation(this, R.anim.flipinnext); 
    animFlipOutNext = AnimationUtils.loadAnimation(this, R.anim.flipoutnext); 
    animFlipInPrevious = AnimationUtils.loadAnimation(this, 
      R.anim.flipinprevious); 
    animFlipOutPrevious = AnimationUtils.loadAnimation(this, 
      R.anim.flipoutprevious); 

    rootAnimFlipInNext = AnimationUtils.loadAnimation(this, 
      R.anim.rootflipinnext); 
    rootAnimFlipOutNext = AnimationUtils.loadAnimation(this, 
      R.anim.rootflipoutnext); 
    rootAnimFlipInPrevious = AnimationUtils.loadAnimation(this, 
      R.anim.rootflipinprevious); 
    rootAnimFlipOutPrevious = AnimationUtils.loadAnimation(this, 
      R.anim.rootflipoutprevious); 
} 
    @Override 
public boolean onTouchEvent(MotionEvent event) { 
    return gestureScanner.onTouchEvent(event); 
} 

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
     float velocityY) { 

    Log.i("TEST", "Fling!!"); 

    if (Math.abs(velocityY) > Math.abs(velocityX)) { 
     if (velocityY > 0) { 
      rootFlipper.setInAnimation(rootAnimFlipInNext); 
      rootFlipper.setOutAnimation(rootAnimFlipOutNext); 
      rootFlipper.showNext(); 
     } else if (velocityY < 0) { 
      rootFlipper.setInAnimation(rootAnimFlipInPrevious); 
      rootFlipper.setOutAnimation(rootAnimFlipOutPrevious); 
      rootFlipper.showPrevious(); 
     } 
    } else { 
     if (velocityX > 0) { 
      ViewFlipper v = (ViewFlipper) rootFlipper.getCurrentView(); 
      v.setInAnimation(animFlipInNext); 
      v.setOutAnimation(animFlipOutNext); 
      v.showNext(); 
     } else if (velocityX < 0) { 
      ViewFlipper v = (ViewFlipper) rootFlipper.getCurrentView(); 
      v.setInAnimation(animFlipInPrevious); 
      v.setOutAnimation(animFlipOutPrevious); 
      v.showPrevious(); 
     } 
    } 
    return true; 
} 

La mise en page:

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

<ViewFlipper 
    android:id="@+id/rootFlipper" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <ViewFlipper 
     android:id="@+id/viewFlipper1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 

     <LinearLayout 
      android:id="@+id/innerone" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="#ff0000" 
      android:orientation="vertical" > 

      <TextView 
       android:id="@+id/textView1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="LAYOUT 1-1" 
       android:textAppearance="?android:attr/textAppearanceLarge" /> 
     </LinearLayout> 

     <LinearLayout 
      android:id="@+id/innertwo" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="#ff0000" 
      android:orientation="vertical" > 

      <TextView 
       android:id="@+id/textView2" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="LAYOUT 1-2" 
       android:textAppearance="?android:attr/textAppearanceLarge" /> 
     </LinearLayout> 

     <LinearLayout 
      android:id="@+id/innerthree" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="#ff0000" 
      android:orientation="vertical" > 

      <TextView 
       android:id="@+id/textView3" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="LAYOUT 1-3" 
       android:textAppearance="?android:attr/textAppearanceLarge" /> 
     </LinearLayout> 
    </ViewFlipper> 

    <ViewFlipper 
     android:id="@+id/viewFlipper2" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 

     <LinearLayout 
      android:id="@+id/innerone" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="#00ff00" 
      android:orientation="vertical" > 

      <TextView 
       android:id="@+id/textView4" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="LAYOUT 2-1" 
       android:textAppearance="?android:attr/textAppearanceLarge" /> 
     </LinearLayout> 

     <LinearLayout 
      android:id="@+id/innertwo" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="#00ff00" 
      android:orientation="vertical" > 

      <TextView 
       android:id="@+id/textView5" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="LAYOUT 2-2" 
       android:textAppearance="?android:attr/textAppearanceLarge" /> 
     </LinearLayout> 

     <LinearLayout 
      android:id="@+id/innerthree" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="#00ff00" 
      android:orientation="vertical" > 

      <TextView 
       android:id="@+id/textView6" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="LAYOUT 2-3" 
       android:textAppearance="?android:attr/textAppearanceLarge" /> 
     </LinearLayout> 
    </ViewFlipper> 
</ViewFlipper> 

</LinearLayout> 

Les animations:

flipinnext.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
android:interpolator="@android:anim/decelerate_interpolator" > 
<translate 
    android:duration="500" 
    android:fromXDelta="-100%" 
    android:toXDelta="0%" /> 
</set> 

flipinprevious.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
android:interpolator="@android:anim/decelerate_interpolator" > 
<translate 
    android:duration="500" 
    android:fromXDelta="100%" 
    android:toXDelta="0%" /> 
</set> 

flipoutnext.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
android:interpolator="@android:anim/decelerate_interpolator" > 

<translate 
    android:duration="500" 
    android:fromXDelta="0%" 
    android:toXDelta="100%" /> 

</set> 

flipoutprevious.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
android:interpolator="@android:anim/decelerate_interpolator" > 

<translate 
    android:duration="500" 
    android:fromXDelta="0%" 
    android:toXDelta="-100%" /> 

</set> 

Et vous avez besoin d'un ensemble d'animations presque identiques pour le flip racine (axe y). Copiez simplement les animations de l'axe des x et changez les attributs de translation en axe Y.

+0

Wow!J'avais abandonné cette méthode, mais je suis impressionné! +50 – platinummonkey

+0

Question de suivi pour Andreas - savez-vous s'il est possible d'imbriquer un ViewFlipper dans un LinearLayout? ou RelativeLayout d'ailleurs? –

+0

Je ne suis pas tout à fait sûr de ce que vous voulez dire, mais je suis sûr que c'est possible. La présentation présentée ci-dessus utilise LinearLayout en tant que racine. L'utilisation de plusieurs ViewFlipper-trees (comme présenté ci-dessus) dans deux, ou plus, LinearLayouts dans la même vue ne devrait pas poser de problème. (Autre que les interactions complexes et la hiérarchie de mise en page quelque peu profonde) – Andreas