2012-08-24 1 views
0

J'ai récemment commencé à programmer à nouveau pour l'android et je travaille actuellement sur une application que je voudrais mettre en œuvre des téléavertisseurs à vue horizontale de sorte que l'utilisateur dans une instance peut glisser entre deux pages vers entrer/mettre à jour les informations et, plus tard, parcourir quatre pages pour voir les informations entrées/mises à jour. Je fais essentiellement une feuille de personnage électronique pour les jeux de rôle.Android: Horizontal View Pager pas sur l'écran principal

Je travaille hors de ces tutoriels pour téléavertisseurs vue horizontale: http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging/

http://manishkpr.webheavens.com/android-viewpager-example/

Ma question est de tous les tutoriels que j'ai vu, l'h. view pager est utilisé hors de l'écran d'activité principal, existe-t-il un moyen d'implémenter le pager vue horizontale hors d'un écran ultérieur? Chaque fois que j'ai essayé d'implémenter le code pour travailler sur une page autre qu'un écran principal, il s'est écrasé dès que je suis arrivé sur cette page. Bref, en bref, quelqu'un a-t-il réussi à mettre en place des téléavertisseurs à affichage horizontal sur une page non principale et, dans l'affirmative, comment?

J'espère que j'ai fait sens, mais si vous avez d'autres questions s'il vous plaît faites le moi savoir!


08-24 01: 44: 34,310: I/ActivityManager (144): {DEPART cmp = com.echaractersheet/.CharacterStats1} de pid 15115 janvier 8 à 24: 44: 34,360: D/AndroidRuntime (15115): Arrêt de VM 08-24 01: 44: 34.360: W/dalvikvm (15115): threadid = 1: thread sortant avec une exception non interceptée (groupe = 0x40a581f8) 08-24 01: 44: 34.370: E/AndroidRuntime (15115): EXCEPTION FATALE: principal 08-24 01: 44: 34.370: E/AndroidRuntime (15115): java.lang.RuntimeException: Impossible de démarrer l'activité ComponentInfo {com.echaractersheet/com.echaractersheet.CharacterStats1}: java .lang.NullPointerException


characterstats.xml:

<android.support.v4.view.ViewPager 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:id="@+id/characterstatspager" /> 

characterstats1.xml et characterstats2.xml sont les deux pages que je veux glisser entre

CharacterStatsPagerAdapter.java: ...

public class CharacterStatsPagerAdapter extends PagerAdapter { 
public int getCount() { 
    return 2; 
} 

public Object instantiateItem(View collection, int position) { 
    LayoutInflater inflater = (LayoutInflater) collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    int resId =0; 
    switch (position) { 
    case 0: 
     resId = R.layout.characterstats1; 
     break; 
    case 1: 
     resId = R.layout.characterstats2; 
     break; 
    } 
    View view = inflater.inflate(resId, null); 

    ((ViewPager) collection).addView(view, 0); 

    return view; 
} 

@Override 
public void destroyItem(View arg0, int arg1, Object arg2) { 
    ((ViewPager) arg0).removeView((View) arg2); 
} 

@Override 
public boolean isViewFromObject(View arg0, Object arg1) { 
    return arg0 == ((View) arg1); 
} 

@Override 
public Parcelable saveState() { 
    return null; 
} 

}

CharacterStats1.java:

 CharacterStatsPagerAdapter adapter = new CharacterStatsPagerAdapter(); 
     ViewPager myPager = (ViewPager) findViewById(R.id.characterstatspager); 
     myPager.setAdapter(adapter); 
     myPager.setCurrentItem(0); 
+0

Qu'appelez-vous "page principale". Pouvez-vous nous donner votre erreur exacte? – Aerilys

+0

J'ai mes activity_main.java et activity_main.xml. Je n'avais pas de logcat en cours d'exécution au moment du crash, donc je ne suis pas sûr de l'erreur. Mais à partir de activity_main.java, l'utilisateur est amené à characterstats.java/characterstats.xml, point auquel je veux que l'utilisateur puisse glisser vers une seconde page. Désolé je n'ai pas le code pour le rendre plus clair, je l'ai construit et détruit tellement de fois. – Malo

+0

Il est difficile de vous fournir une solution sans le code, mais pour ma part, je n'ai jamais eu de difficulté à implémenter le viewpager de la façon que vous décrivez. – Aerilys

Répondre

0

bien que le pager fonctionnera avec les données de l'adaptateur, aussi longtemps que vous gardez les objets dans l'adaptateur, vous êtes prêt à partir. donc peut-être avant d'aller à l'écran suivant, vous devriez enregistrer les objets dans l'adaptateur (peut-être un champ statique dans une autre classe, juste un instant) et quand vous arrivez à la nouvelle page, vous pouvez récupérer les objets dans l'adaptateur du nouveau viewpager et ajoutez les nouvelles pages. C'est ce que je ferai dans votre cas.

MISE À JOUR:

cela est juste un exemple, il a besoin de plus de lignes de code, mais est un bon début.

public class Fields { 
    private String name; 
    private String lastName; 
    private int age; 
    private boolean male; 

    public Fields(){ 
     this.name = ""; 

     this.lastName = ""; 
    } 

    public Fields(String name, String lastName, int age, boolean male) { 
     this.name = name; 
     this.lastName = lastName; 
     this.age = age; 
     this.male = male; 
    } 

    public View getRepresentation(Context mContext){ 
     /*Create the view that ViewPager will display*/ 
     LinearLayout layout = new LinearLayout(mContext); 
     layout.addView(new TextView(mContext)); //Name 
     layout.addView(new TextView(mContext)); //LastName 
     layout.addView(new TextView(mContext)); //Age 
     layout.addView(new CheckBox(mContext)); //Male/Female 
     return layout; 
    } 

} 

La vue Adaptateur Pager

public class ViewPagerAdapter extends PagerAdapter { 

    private List<Fields> pages; 
    private Context mContext; 

    public ViewPagerAdapter(Context mContext) 
    { 
     this.mContext = mContext; 
    } 

    public void setPages(List<Fields> pages){ 
     this.pages = pages; 
    } 

    public List<Fields> getPages(){ 
     return this.pages; 
    } 

    @Override 
    public int getItemPosition(Object object) { 
      return POSITION_NONE; 
    } 

    @Override 
    public int getCount() 
    { 
     return pages.size(); 
    } 

    @Override 
    public Object instantiateItem(View pager, int position) 
    { 
     View view = pages.get(position).getRepresentation(mContext); 
     view.setId(position); 
     return view; 
    } 

    @Override 
    public void destroyItem(View pager, int position, Object view) 
    { 
     ((ViewPager)pager).removeViewInLayout((View) view); 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) 
    { 
     return view.equals(object); 
    } 

} 

classe principale

public class MainActivity extends Activity { 

private Context mContext; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.mContext = getApplicationContext(); 
    setContentView(R.layout.viewpager_layout); 
    final List<Fields> fields = new ArrayList<Fields>(); 
    fields.add(new Fields()); 
    ViewPager mPager = (ViewPager) this.findViewById(R.id.viewpager); 
    Button nextActivity = (Button) this.findViewById(R.id.nextAct); 
    ViewPagerAdapter mAdapter = new ViewPagerAdapter(mContext); 
    mAdapter.setPages(fields); 
    mPager.setAdapter(mAdapter); 
    nextActivity.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      SecondActivity.pages = fields; 
      Intent intent = new Intent(mContext, SecondActivity.class); 
      startActivity(intent); 
     } 
    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

}

deuxième classe

public class SecondActivity extends Activity { 

    public static List<Fields> pages; 
    private Context mContext; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.mContext = getApplicationContext(); 
     setContentView(R.layout.viewpager_layout); 

     final List<Fields> fields = pages; 
     pages = null; 
     fields.add(new Fields()); //Add the new Pages 
     ViewPager mPager = (ViewPager) this.findViewById(R.id.viewpager); 
     Button nextActivity = (Button) this.findViewById(R.id.nextAct); 
     ViewPagerAdapter mAdapter = new ViewPagerAdapter(mContext); 
     mAdapter.setPages(fields); 
     mPager.setAdapter(mAdapter); 
     nextActivity.setVisibility(View.GONE); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 


} 

Comme je l'ai dit, c'est juste un EXEMPLE, la classe Fields devrait être changé pour vos objets, ViewPagerAdapter est l'endroit où vous gardez la liste des pages que vous passerez à l'activité suivante. Et le champ statique sur la deuxième activité est juste d'être utilisé comme un pont entre les activités et ne devrait pas être abusif, c'est pourquoi après avoir récupéré les données, vous devez définir à NULL pour savoir que vous déjà saisi la valeur. J'espère que cela aide.

REMARQUE: CE CODE NE FONCTIONNERA PAS COMME IL EST, besoin de plus de code.

+0

Merci, je suis curieux, comment voulez-vous allez-vous mettre en œuvre ce que vous avez décrit ci-dessus? – Malo

+0

Merci beaucoup, c'est beaucoup plus que ce à quoi je m'attendais et ce sera une ressource très précieuse! – Malo

+0

votre accueil, si cela vous a aidé à résoudre votre problème initial, s'il vous plaît marquer cela comme une réponse pour les autres de le voir. bonne journée. –