Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 必知必會 - RadioGroup 和 ViewPager 聯動

Android 必知必會 - RadioGroup 和 ViewPager 聯動

編輯:關於Android編程

如果移動端訪問不佳或需要更好的閱讀體驗,歡迎使用 ==> Github 版

使用 RadioGroup 和 ViewPager 實現更加可定制的效果。

背景

昨天設計圖剛出一點,寫了《Android 必知必會 - 動態切換著色模式和全屏模式》,記錄了動態修改頁面顯示模式的方式。今天又有新圖,不過設計師只考慮 iOS 平台的設計,拿到設計圖發現 TabLayout + ViewPager 的套路實現起來很麻煩,考慮了下,為了方便,決定使用 RadioGroup + ViewPager 來實現,之所以使用 RadioGroup ,是因為它內部多個 RadioButton 的狀態是互斥的,也就是只有一個是選中狀態,不需要我們進行多余的處理。總體來說比較簡單,就是細節略多了點。

主要知識點:

自定義 RadioButton 樣式 : selector + shape 自定義 RadioButton 文字樣式 : selector ViewPager + Fragment 及其適配器 RadioGroup 狀態監聽 ViewPager 頁面切換監聽

實現

先看效果圖:

\

思路

UI:

頂部是 RadioGroup ,內部包含兩個 RadioButton
RadioButton 需要自定義背景和文字 中間是 ViewPager

聯動事件:

ViewPager
需要為 ViewPager 寫適配器,以配合 Fragment 使用 addOnPageChangeListener() 為其添加監聽頁面變動的事件 在 onPageSelected(int position) 方法中修改 RadioGroup 中 RadioButton 的選中狀態 RadioGroup
設置 setOnCheckedChangeListener 監聽,並在其中修改 ViewPager 的狀態

實現 UI



    

        

            

            
        

        
    

    

重點在 RadioButton 的幾個屬性:

android:button="@null" 隱藏 RadioButton 默認的圖標 android:background="@drawable/top_r_bg" 設置背景,實際上是一個 selector android:textColor="@drawable/top_r_text" 設置文字顏色,它也是一個 selector 對於第二個 RadioButton : android:layout_marginLeft="-1dp" 和描邊寬度一樣,防止出現間隙

下面把 xml 代碼放在一起看,它們都放在 drawable 目錄下:



    
    




    
    
    




    
    




    
    

上面只貼出了左邊按鈕的樣式,右邊的類似,不再張貼。UI 到這裡已經完成,下面看事件:

實現聯動事件

private void init() {
        List fragments = new ArrayList<>();
        fragments.add(new FragmentMain01A());
        fragments.add(new FragmentMain01B());

        NotePagerAdapter pagerAdapter = new NotePagerAdapter(getFragmentManager(), fragments);
        mainViewpager.setAdapter(pagerAdapter);
  /**
   * 為 Viewpager 設置頁面切換監聽,當頁面切換完成被選中時,我們同步 RadioButton 的狀態
   **/
        mainViewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                if (position == 0) radioButtonA.setChecked(true);
                else radioButtonB.setChecked(true);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
  /**
   * 為 RadioGroup 設置選中變化事件監聽,當 RadioButton 狀態變化,我們同步 Viewpager 的選中頁面
   **/
        mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                if (checkedId == radioButtonA.getId()) mainViewpager.setCurrentItem(0);
                else if (checkedId == radioButtonB.getId()) mainViewpager.setCurrentItem(1);
            }
        });

        //設置默認選中頁
        mainViewpager.setCurrentItem(0);
    }

對了,還有 NotePagerAdapter 的代碼,這個比較簡單,是 ViewPager 和 Fragment 的適配器:

public class NotePagerAdapter extends FragmentStatePagerAdapter {
    private List mFragments;

    public  NotePagerAdapter(FragmentManager fm, List fragments) {
        super(fm);
        mFragments = fragments;
    }

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

    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

}

總結

注意,以上代碼使用的是 android.support.v4 包的類,理論上不使用 V4 包是沒問題的。

看完整體的代碼發現並沒什麼難點,純屬基礎知識的疊加,主要是 UI 控件上的細節需要處理的比較多。

再者,如果頂部的控件超過2個,還需要更多的 xml 文件,頂部的幾個控件是可以封裝成一個自定義 View 的,甚至加上中間的 ViewPager 一起封裝。等待我後面的成果吧。如果有什麼疑問或建議,可以通過文末的聯系方式和我交流。

最後,紀念一下自己今天正式成為 CSDN博客專家 ,祝願廣大程序員都能在編程的路上有所成就!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved