ホームページ  >  記事  >  Java  >  Android アプリで ViewPager+Fragment を使用してスライド切り替え効果を実現する

Android アプリで ViewPager+Fragment を使用してスライド切り替え効果を実現する

高洛峰
高洛峰オリジナル
2017-01-13 11:44:201380ブラウズ

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 - すべて存在するため、画像などの大量のデータをロードするのには適しておらず、メモリがオーバーフローしやすいです。

プロジェクト構造:

Android App中使用ViewPager+Fragment实现滑动切换效果

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 があります:

Android App中使用ViewPager+Fragment实现滑动切换效果

ViewPager+Fragment の使用に関するその他の関連記事。 Android アプリでスライド切り替え効果を実現 PHP 中国語 Web サイトにご注意ください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。