2010-06-11 6 views
4

J'ai un ListView. Lorsque je sélectionne un élément dans le ListView, je voudrais avoir une diapositive Subview à partir de la droite, comme c'est le cas dans de nombreuses applications.Android ListView - Slide Subview à partir de droite?

J'ai été à la recherche de tutoriels sur ce sujet, mais je tourne mes roues. Peut-être que Android utilise un terme différent de "Subview"?

Voici ce que je fini par faire:

  1. Créer une nouvelle classe pour la sous-vue

  2. Ajouter la classe sous-vue au Manifest avec <activity android:name=".SubViewClassName" /> dans la balise <application>

  3. Ajouter cette à la classe principale ("lv" est le ListView)

    lv.setOnItemClickListener (nouveau OnItemClickListener() {
    onItemClick public void (parent AdapterView, Vue vue, position int, long id) {

     Intent myIntent = new Intent(view.getContext(),SubView.class); 
    
          startActivityForResult(myIntent, 0); 
    
        } 
    

    });

+0

Il n'y a pas « sous-vue » dans Android, du moins pas par ce nom. – CommonsWare

+0

avez-vous une image ??? – Jorgesys

+0

Une image de quoi? Je veux cliquer sur un élément de ListView, puis faire apparaître un nouveau ListView, en fonction de la ligne sélectionnée dans le ListView d'origine. – Chris

Répondre

3

La chose la plus simple est d'avoir votre deuxième ListView être dans une Activity séparée. Si l'utilisateur a activé les animations inter-activités (ce qui est la valeur par défaut), votre deuxième ListView va glisser à partir de la droite.

+1

Vous pouvez également remplacer la transition à l'aide de Activity.overridePendingTransition() si vous souhaitez forcer l'utilisateur à faire glisser les transitions gauche/droite entre les activités. – Zargoon

3

Pour que cela fonctionne, vous devrez utiliser un ViewFlipper

Voici comment vous définiriez votre fichier main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<ViewFlipper xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/flipper" android:layout_width="fill_parent" 
android:layout_height="fill_parent" android:versionCode="1" android:versionName="1.0"> 
    <include android:id="@+id/first" layout="@layout/home_screen" /> 
    <include android:id="@+id/second" layout="@layout/info_screen" /> 
</ViewFlipper> 

Les fichiers XML pour les deux vues sont home_screen et info_screen dans ce cas. Vous pouvez les nommer comme vous le souhaitez.

Dans votre code, vous devez placer dans votre méthode onCreate(): méthode

flipper = (ViewFlipper) findViewById(R.id.flipper); 

De plus vous avez besoin de ces méthodes ci-dessous votre onCreate().

private Animation inFromRightAnimation() { 

    Animation inFromRight = new TranslateAnimation(
      Animation.RELATIVE_TO_PARENT, +1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, 
      Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f 
    ); 
    inFromRight.setDuration(800); 
    inFromRight.setInterpolator(new AccelerateInterpolator()); 
    return inFromRight; 
} 
private Animation outToLeftAnimation() 
{ 
    Animation outtoLeft = new TranslateAnimation(
      Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, -1.0f, 
      Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f 
    ); 
    outtoLeft.setDuration(800); 
    outtoLeft.setInterpolator(new AccelerateInterpolator()); 
    return outtoLeft; 
} 
private Animation inFromLeftAnimation() { 
    Animation inFromLeft = new TranslateAnimation(
      Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, 
      Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f 
    ); 
    inFromLeft.setDuration(800); 
    inFromLeft.setInterpolator(new AccelerateInterpolator()); 
    return inFromLeft; 
} 
private Animation outToRightAnimation() { 
    Animation outtoRight = new TranslateAnimation(
      Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, +1.0f, 
      Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f 
    ); 
    outtoRight.setDuration(800); 
    outtoRight.setInterpolator(new AccelerateInterpolator()); 
    return outtoRight; 
} 

Et quand vous êtes prêt utilisez simplement

flipper.setInAnimation(inFromRightAnimation()); 
flipper.setOutAnimation(outToRightAnimation()); 
flipper.showNext(); 
+0

Merci ... Je vais essayer ceci et faire un rapport. – Chris

+0

Pas de problème. Une chance avec ça? – Ryan

+0

Cela a fonctionné très bien pour moi. Je vous remercie. –

1

Peut-être que je me trompe, mais vous pouvez utiliser un overridePendingTransition dans cette sous-activité?

Dans votre activité principale:

public void onItemSelected(String id) { 
    Intent myIntent= new Intent(this, MySubActivity.class); 
     myIntent.putExtra("param1", param1); // some parameters 
     startActivityForResult(myIntent, 0); 
} 

Ou quel que soit le code que vous voulez.La chose principale est dans votre sous-activité (et sous-vue) comme dans MySubActivity:

protected void onCreate(Bundle savedInstanceState) { 
    ... 
    // autogenerated code and your code here 
    ... 
    this.overridePendingTransition(R.anim.enter_from_right, R.anim.exit_to_left); 
} 

Voici les fichiers d'animation dans le dossier res/anim

enter_from_right.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="false"> 
    <translate 
     android:fromXDelta="100%" android:toXDelta="0%" 
     android:fromYDelta="0%" android:toYDelta="0%" 
     android:duration="700"/> 
</set> 

exit_to_left.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="false"> 
    <translate 
     android:fromXDelta="0%" android:toXDelta="-100%" 
     android:fromYDelta="0%" android:toYDelta="0%" 
     android:duration="700"/> 
</set> 

Espérons que ça aide.

0

Tout petit ajout à la réponse de Ryan (à l'aide ViewFlipper):

public void onShowRight(View v) { 
    flipper.setInAnimation(inFromRightAnimation()); 
    flipper.setOutAnimation(outToLeftAnimation()); 
    flipper.showNext();   
} 

public void onShowLeft(View v) { 
    flipper.setInAnimation(inFromLeftAnimation()); 
    flipper.setOutAnimation(outToRightAnimation()); 
    flipper.showPrevious();   
}