Android アプリケーションでは、マルチスクリーン スライドは非常に一般的なスタイルです。ViewPager を使用しない場合、コードの実装は非常に長くなります。ただし、ViewPager を使用すると、Android をインポートする必要があるという欠点もあります。 -support-v4 .jar、詳細は制御できません。しかし、今では状況が異なります。android-support-v4 は多くの実用的な機能を提供するため、新しい Android プロジェクトはデフォルトでこの jar パッケージをインポートします。次に、スライド用のビューページャーも使用します。もう 1 つの概念は、Fragment と FragmentActivity です。Fragment は、アクティビティと一致するライフ サイクルとビューと一致するインターフェイスを持つ特別なクラスです。ただし、Fragment はライフ サイクルと一致しないことに注意してください。 View との継承関係はありません。 Fragment を使用する利点は、Fragment を再利用でき、各 Fragment がアクティビティと同じように独自のビジネスを内部で処理できることです。これにより、モジュール間の結合が低くなり、アクティビティ内にすべてのビジネスを記述するよりも内部ロジックがはるかに明確になります。 。また、各モジュールのビジネスは Fragment 内に実装されているため、アクティビティは複数の Fragment を管理するだけで済み、ビジネス関連の作業を行う必要はありません。最終的に、Fragment を使用してさまざまな解像度の一致に対応できます。フラグメントは SDK (Android 3.0 以降) と android-support-v4 で利用できますが、互換性の問題のため、APK を 3.0 でのみ実行したい場合を除き、android-support-v4 のフラグメントのみを使用できます。将来の Android では電話の場合、FragmentActivity の状況は Fragment と同様になります。 Fragment と FragmentActivity については、実際には理解する必要のある基本的な使い方がありますが、Fragment はこの記事の焦点ではないことを考慮して、ここでは紹介しません。また、この記事では、Fragment を使用して簡単なインターフェイスを作成します。 、これは誰でも一目で理解できるはずです。 さて、本題に戻りましょう。
ViewPager + Fragment は、actionbarsherlock から抽出されたコードで、スライドすることで切り替えられることが知られています。直接コードに進みましょう
ここでは、FragmentStatePagerAdapter と FragmentPagerAdapter について簡単に説明します
2 つのアダプター:
最初のフラグメント状態アダプター - 現在、最初のフラグメント、現在のフラグメント、および次のフラグメントのみが存在し、その他は破棄されます, 複数のデータをロードするのに適しています;
2 番目の FragmentPagerAdapter - すべて存在するため、画像などの大量のデータをロードするのには適しておらず、メモリがオーバーフローしやすいです。
プロジェクト構造:
1. アクティビティアダプターまとめ(静的型フラグメント)
public class ViewPageFragment extends FragmentActivity { //这个是有多少个 fragment页面 static final int NUM_ITEMS = 5; private MyAdapter mAdapter; private ViewPager mPager; private int nowPage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pagers_fragment_main); mAdapter = new MyAdapter(getSupportFragmentManager() ); mPager = (ViewPager)findViewById(R.id.mypagers_pager); mPager.setAdapter(mAdapter); } /** * 有状态的 ,只会有前3个存在 其他销毁, 前1个, 中间, 下一个 */ public static class MyAdapter extends FragmentStatePagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return NUM_ITEMS; } //得到每个item @Override public Fragment getItem(int position) { return ArrayFragment.newInstance(position); } // 初始化每个页卡选项 @Override public Object instantiateItem(ViewGroup arg0, int arg1) { // TODO Auto-generated method stub return super.instantiateItem(arg0, arg1); } @Override public void destroyItem(ViewGroup container, int position, Object object) { System.out.println( "position Destory" + position); super.destroyItem(container, position, object); } } /** * 无状态的 会全部加载着, 这个适合少量的 特别多的图片啊啥的 还是用 FragmentStatePagerAdapter * @author lilei */ // public static class MyAdapter extends FragmentPagerAdapter { // public MyAdapter(FragmentManager fm ) { // super(fm); // // } // // @Override // public int getCount() { // return NUM_ITEMS; // } // // @Override // public Fragment getItem(int position) { // // 返回相应的 fragment // return ArrayFragment.newInstance(position); // } // // @Override // public void destroyItem(ViewGroup container, int position, Object object) { // System.out.println( "position Destory" + position); // super.destroyItem(container, position, object); // } // } /** * 所有的 每个Fragment */ public static class ArrayFragment extends Fragment { int mNum; static ArrayFragment newInstance(int num) { ArrayFragment array= new ArrayFragment(); Bundle args = new Bundle(); args.putInt("num", num); array.setArguments(args); return array; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mNum = getArguments() != null ? getArguments().getInt("num") : 1; System.out.println("mNum Fragment create ="+ mNum); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { System.out.println("onCreateView = "); //在这里加载每个 fragment的显示的 View View v = null; if(mNum == 0){ v = inflater.inflate(R.layout.pagers_fragment1, container, false); ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum"); }else if(mNum == 1){ v = inflater.inflate(R.layout.pagers_fragment1, container, false); ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum"); }else if(mNum == 2){ v = inflater.inflate(R.layout.pagers_fragment1, container, false); ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum"); }else{ v = inflater.inflate(R.layout.pagers_fragment1, container, false); ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum"); } return v; } @Override public void onActivityCreated(Bundle savedInstanceState) { System.out.println("onActivityCreated = "); super.onActivityCreated(savedInstanceState); } @Override public void onDestroyView(){ System.out.println(mNum + "mNumDestory"); super.onDestroyView(); } @Override public void onDestroy(){ super.onDestroy(); } } }
2. 1.とあまり変わりません(使い方は人それぞれ)
public class ViewPageFragmentCS extends FragmentActivity { //这个是有多少个 fragment页面 private MyAdapter mAdapter; private ViewPager mPager; private List<Entity> list = new ArrayList<ViewPageFragmentCS.Entity>();; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pagers_fragment_main); for (int i = 0; i < 7 ; i++) { Entity ee = new Entity(); ee.name = "ll"+ i; ee.age = ""+ i; list.add(ee); } mAdapter = new MyAdapter(getSupportFragmentManager(),list); mPager = (ViewPager)findViewById(R.id.mypagers_pager); mPager.setAdapter(mAdapter); } private class Entity{ public String name; public String age; } // 在这里你可以传 list<Fragment> 也可以传递 list<Object>数据 public class MyAdapter extends FragmentStatePagerAdapter { List<Entity> list_ee; public MyAdapter(FragmentManager fm, List<Entity> ee) { super(fm); this.list_ee = ee ; } @Override public int getCount() { return list_ee.size(); } // 初始化每个页卡选项 @Override public Object instantiateItem(ViewGroup arg0, int position) { ArrayFragment ff = (ArrayFragment)super.instantiateItem(arg0, position); ff.setThings(list_ee.get(position),position); return ff; } @Override public void destroyItem(ViewGroup container, int position, Object object) { System.out.println( "position Destory" + position); super.destroyItem(container, position, object); } @Override public Fragment getItem(int arg0) { // TODO Auto-generated method stub return new ArrayFragment(); } } /** * 所有的 每个Fragment */ public class ArrayFragment extends Fragment { private Entity ee; private int position; public void setThings(Entity ee,int position){ this.ee =ee ; this.position = position; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { System.out.println("onCreateView = "); //在这里加载每个 fragment的显示的 View View v = inflater.inflate(R.layout.pagers_fragment1, container, false); ((TextView)v.findViewById(R.id.textView1)).setText(ee.name+ "= ee.Name -=age"+ ee.age); return v; } @Override public void onActivityCreated(Bundle savedInstanceState) { System.out.println("onActivityCreated = "); super.onActivityCreated(savedInstanceState); } @Override public void onDestroyView(){ System.out.println("onDestroyView = "+ position); super.onDestroyView(); } @Override public void onDestroy(){ System.out.println("onDestroy = "+ position); super.onDestroy(); } } }
そのままコピーしてください. V4 パッケージを忘れないでください。xml レイアウト ファイルは自分で完成させることができます。
3 番目のページにスライドすると、1 番目のページが破棄され、4 番目のページが生成されていることがわかります。現在、2、3、4 があります:
ViewPager+Fragment の使用に関するその他の関連記事。 Android アプリでスライド切り替え効果を実現 PHP 中国語 Web サイトにご注意ください。