最初の 3 つのセクションでは、通常の下部ナビゲーション バーの効果を実現するためにさまざまな方法を使用しましたが、このセクションでは、2 番目の例に基づいて ViewPager を追加して、スライドしてページを切り替える効果を実現します。私の友人のほとんどは、この ViewPager が何であるかを知っています。知らなくても問題ありません。このコントロールを簡単に紹介しましょう。
1. ViewPager の概要
1) どのような制御ですか?
回答: ページ切り替えコンポーネントです。複数のビューを入力し、タッチ スクリーン上で左右にスライドすることで、異なるビュー間を切り替えることができます。前に学習した ListView と同様に、Adapter (アダプター)、View が必要です。表示され、ViewPager がバインドされており、ViewPager には独自の固有のアダプター - ページャーアダプターがあります。さらに、Google は、Fragment を使用して ViewPager を埋めることを公式に推奨しています。これにより、各ページの生成と各ページのライフ サイクルの管理がより便利になります! もちろん、FragmentPageAdapter と FragmentStatePagerAdapter という 2 つの異なるアダプターが提供さ れます。!このセクションで使用するのは前者の FragmentPageAdapter です。もう 1 つ言及すべき点は、ViewPager のキャッシュ メカニズムです。ViewPager は現在のページ、前のページ、次のページをキャッシュします。たとえば、1、2、3、4 の 4 つのページがあります。最初のページにいるとき: キャッシュ 1、2
——> 2 ページ目: キャッシュ 1、2、3
——> 3 ページ目: キャッシュ 2、3、4 ——> 4 ページ目: キャッシュ 3、4 など。
2) PagerAdapter を使用して関連メソッドを書き換えます。
- getCount( ) : ビューページャーにあるビューの数を取得します。
- destroyItem( ) : 指定された場所にあるページを削除します。このビューをコンテナから削除するのはアダプタの責任です。これは、finishUpdate(viewGroup) が返されたときにビューが確実に削除されるようにするためです。
- instantiateItem( ) : ① 指定された位置のビューを ViewGroup (コンテナ) に追加し、作成して表示します。 ② 新しく追加されたページを表すオブジェクト (キー) を返します。通常はビュー自体を直接返すだけですが、もちろん可能です独自のキーをカスタマイズできますが、キーと各ビューの間には 1 対 1 の対応が必要です。
- isViewFromObject (): instantiateItem(ViewGroup, int) 関数によって返されたキーとページ ビューが同じビューを表すかどうか (つまり、それらが互いに対応し、同じビューを表すかどうか) を判断します。通常は return view = と直接記述します。 = object; 以上です。なぜこれが複雑かについては、後で理解する機会があります。ViewPager にはビューステートの情報を格納する ArrayList があり、View! に従って対応する情報を取得するようです。
PS:すべてのメソッドを書き直す必要はありません~
2. エフェクト図とプロジェクトのディレクトリ構造を確認します。
まず達成したい効果を見てみましょう。
プロジェクトの構造を見てみましょう。
3. コードの実装:
ステップ 1: 関連するリソース ファイルの準備:
PS: 下部ナビゲーションバーの方法 2 を実現することをベースに作成したので、リソース ファイルをコピーできます。ここでは何度も載せませんよ~!
ステップ 2: activity_main.xml のレイアウト ファイルを作成します。
PS: 以前の FrameLayout を android.support.v4.view.ViewPager に置き換えるだけです。
activity_mian.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height ="match_parent" tools:context=".MainActivity"> <RelativeLayout android:id="@+id/ly_top_bar" android:layout_width="match_parent" android:layout_height="48dp" android:background="@color/bg_topbar" > <TextView android:id="@+id/txt_topbar" android:layout_width="match_parent" android:layout_height="match_parent" layout_height="match_parent" android:layout_centerInParent="true" android:gravity="center" android:text="提醒" android:textColor="@color/text_topbar" android:textSize="18sp" /> <View android:layout_width="match_parent" android:layout_height="2px" android:layout_alignParentBottom="true" android :background="@color/div_white" /> </RelativeLayout> <RadioGroup android:id="@+id/rg_tab_bar" android:layout_width="match_parent" android:layout_height="56dp" android:layout_alignParentBottom="true" android :背景="@color/bg_white" android:orientation="horizontal"> <RadioButton android:id="@+id/rb_channel" style="@style/tab_menu_item" android:drawableTop="@drawable/tab_menu_channel" android:text="@string/tab_menu_alert" /> <RadioButton android:id=" @+id/rb_message" style="@style/tab_menu_item" android:drawableTop="@drawable/tab_menu_message" android:text="@string/tab_menu_profile" /> <RadioButton android:id="@+id/rb_better" スタイル="@style/tab_menu_item" アンドロイド:drawableTop="@drawable/tab_menu_better" android:text="@string/tab_menu_pay" /> <RadioButtonレイアウト幅 = "親の一致" android:layout_height = "親の一致" android:id="@+id/rb_setting" style="@style/tab_menu_item" android:drawableTop="@drawable/tab_menu_setting" android:text="@string/tab_menu_setting" /> </RadioGroup> <View android:id ="@+id/div_tab_bar" android:layout_width="match_parent" android:layout_height="2px" android:layout_above="@id/rg_tab_bar" android:background="@color/div_white" /> <android.support.v4 .view.ViewPager アンドロイド:id="@+id/vpager" アンドロイド:layout_width="match_parent" android:layout_above="@id/div_tab_bar" android:layout_below="@id/ly_top_bar" /> </RelativeLayout>
ステップ 3: フラグメントのレイアウトとコードを作成します。
PS: ちなみに、ViewPager の仕組みを説明するために、ここでは 4 つの Fragment を特別に記述しています。作成したものを印刷します。CreateView にログインしてください。
fg_content.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height ="match_parent" android:background="@color/bg_white" android:orientation="vertical"> <TextView android:id="@+id/txt_content" android:layout_width="match_parent" android:layout_height="match_parent" android :gravity="center" android:text="呵呵" android:textColor="@color/text_ yellow" アンドロイド:textSize="20sp" /> </LinearLayout>
MyFragment1.java :
/** * 2015/8/28 0028 に Jay によって作成されました。 */ public class MyFragment1 extends Fragment { public MyFragment1() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle SavedInstanceState) { View view = inflater. inflate(R.layout.fg_content, コンテナ, false); TextView txt_content = (TextView) view.findViewById(R.id.txt_content); txt_content.setText("第一フラグメント"); Log.e("へへ", "1日狗"); ビューを返す。 } }
残りの 3 つはひょうたんのようなものです。何かを変更してください。
ステップ 4: FragmentPagerAdapter クラスをカスタマイズします。
コードは非常にシンプルで、FragmentManager を渡すだけで、他のすべてがここで行われます。
/** * 2015/8/31 0031 に Jay によって作成されました。 */ public class MyFragmentPagerAdapter extends FragmentPagerAdapter { private Final int PAGER_COUNT = 4; プライベート MyFragment1 myFragment1 = null; プライベート MyFragment2 myFragment2 = null; プライベート MyFragment3 myFragment3 = null; プライベート MyFragment4 myFragment4 = null; public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); myFragment1 = 新しい MyFragment1(); myFragment2 = 新しい MyFragment2(); myFragment3 = 新しい MyFragment3(); myFragment4 = 新しい MyFragment4(); @ オーバーライド public int getCount() { PAGER_COUNT を返します。 壊す; @Override public Object instantiateItem(ViewGroup vg, int Position) { return super.instantiateItem(vg,position) ; @Override public void destroyItem(ViewGroup コンテナ, int 位置, Object オブジェクト) { System.out.println( " position Destory" + Position); super.destroyItem(コンテナ, 位置, オブジェクト); @Override public Fragment getItem(int Position) { フラグメント フラグメント = null; switch (位置) { case MainActivity.PAGE_ONE: フラグメント = myFragment1; MainActivity.PAGE_TWO の場合: フラグメント = myFragment2; 壊す; MainActivity.PAGE_THREE の場合: フラグメント = myFragment3; 壊す; ケース MainActivity.PAGE_FOUR: フラグメント = myFragment4; 壊す; フラグメントを返します 。 } }
ステップ 5: MainActivity の作成:
ロジックは非常に簡単ですので、ご自身の目で確認してください~
MainActivity.java:
パッケージcom.jay.fragmentdemo4; android.os.Bundle をインポートします。 android.support.v4.view.ViewPagerをインポートします。 android.support.v7.app.AppCompatActivityをインポートします。 android.widget.RadioButtonをインポートします。 android.widget.RadioGroupをインポートします。 android.widget.TextViewをインポートします。 /** * 2015/8/28 0028 に Coder-pig によって作成されました。 */ public class MainActivity extends AppCompatActivityimplements RadioGroup.OnCheckedChangeListener, ViewPager.OnPageChangeListener { //UI Objects private TextView txt_topbar; プライベート RadioGroup rg_tab_bar; プライベートラジオボタン rb_channel; プライベートラジオボタン rb_message; プライベートラジオボタン rb_better; プライベートラジオボタン rb_setting; プライベート ViewPager vpager; プライベート MyFragmentPagerAdapter mAdapter; //页面を代表する常量 public static Final int PAGE_ONE = 0; パブリック静的最終整数PAGE_TWO = 1; パブリック静的最終整数PAGE_THREE = 2; パブリック静的最終整数PAGE_FOUR = 3; @Override protected void onCreate(Bundle SavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); バインドビュー(); rb_channel.setChecked(true); プライベート private void bindingViews() { オーバーライド txt_topbar = (TextView) findViewById(R.id.txt_topbar); rg_tab_bar = (RadioGroup) findViewById(R.id.rg_tab_bar); rb_channel = (ラジオボタン) findViewById(R.id.rb_channel); rb_message = (ラジオボタン) findViewById(R.id.rb_message); rb_better = (ラジオボタン) findViewById(R.id.rb_better); rb_setting = (ラジオボタン) findViewById(R.id.rb_setting); rg_tab_bar.setOnCheckedChangeListener(this); vpager = (ViewPager) findViewById(R.id.vpager); vpager.setAdapter(mAdapter); vpager.setCurrentItem(0); vpager.addOnPageChangeListener(this); public void onCheckedChanged(RadioGroup group, int selectedId) { switch (checkedId) { case R.id.rb_channel: vpager.setCurrentItem(PAGE_ONE); 壊す; case R.id.rb_message: vpager.setCurrentItem(PAGE_TWO); 壊す; case R.id.rb_better: vpager.setCurrentItem(PAGE_THREE); 壊す; case R.id.rb_setting: vpager.setCurrentItem(PAGE_FOUR); 壊す; } } // 重写ViewPager页面切り替えの処理方法 @Override public void onPageScrolled(int Position, float PositionOffset, int PositionOffsetPixels) { } @Override public void onPageSelected(int Position) { } @Override public void onPageScrollStateChanged(int state) { //3 つの状態があり、0 は何も行われていないことを意味し、1 はスライド中、2 はスライド中 if (state == 2) { switch ( vpager.getCurrentItem()) { case PAGE_ONE: rb_channel.setChecked(true); ブレーク; case PAGE_TWO: rb_message.setChecked(true); ブレーク; case PAGE_THREE: rb_setting.setChecked(true); ブレーク; rb_better. setChecked(true); 壊す; ケース ページ_4: } } } }
PS: ああ、上にパッケージのインポート部分のコードも投稿しました。間違ったパッケージをインポートすると、不可解なエラーが表示されるのではないかと心配しているからです。ViewPager は v4 パッケージの下にあるため、Fragment、FragmentManager、および FragmentTransaction はすべて V4 パッケージを使用する必要があります。なお、FragmentManagerを取得する方法は、getFragmentManager()を直接使うのではなく、getSupportFragmentManager()を使うことです!
注: ViewPager が RadioButton の後ろに配置されている場合、RadioButton のクリック イベントは無効になります。