Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android底部導航欄—RadioButton+Fragment

Android底部導航欄—RadioButton+Fragment

編輯:關於Android編程

簡單拓展RadioButton控件使用

如果不看這些,就直接下托

RadioButton和CheckBox的區別:
1、單個RadioButton在選中後,通過點擊無法變為未選中

單個CheckBox在選中後,通過點擊可以變為未選中

2、一組RadioButton,只能同時選中一個

 一組CheckBox,能同時選中多個

3、RadioButton在大部分UI框架中默認都以圓形表示

 CheckBox在大部分UI框架中默認都以矩形表示

RadioButton和RadioGroup的關系:

1、RadioButton表示單個圓形單選框,而RadioGroup是可以容納多個RadioButton的容器

2、每個RadioGroup中的RadioButton同時只能有一個被選中

3、不同的RadioGroup中的RadioButton互不相干,即如果組A中有一個選中了,組B中依然可以有一個被選中

4、大部分場合下,一個RadioGroup中至少有2個RadioButton

5、大部分場合下,一個RadioGroup中的RadioButton默認會有一個被選中,並建議您將它放在RadioGroup中的起始位置

簡單代碼

 
   
   
  

    

        
  

 
 

選中項變更的事件監聽:

當RadioGroup中的選中項變更後,您可能需要做一些相應,比如上述例子中,性別選擇“女”後下面的本文也相應改變,又或者選擇不同的性別後,出現符合該性別的頭像列表進行更新,女生不會喜歡使用大胡子作為自己的頭像。

TextView tv = null;//根據不同選項所要變更的文本控件
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);

          setContentView(R.layout.main);

          //根據ID找到該文本控件
          tv = (TextView)this.findViewById(R.id.tvSex);
         //根據ID找到RadioGroup實例
         RadioGroup group = (RadioGroup)this.findViewById(R.id.radioGroup);
        //綁定一個匿名監聽器
         group.setOnCheckedChangeListener(new OnCheckedChangeListener() {

             @Override
             public void onCheckedChanged(RadioGroup arg0, int arg1) {
                 // TODO Auto-generated method stub
                 //獲取變更後的選中項的ID
                 int radioButtonId = arg0.getCheckedRadioButtonId();
                 //根據ID獲取RadioButton的實例
                 RadioButton rb = (RadioButton)MyActiviy.this.findViewById(radioButtonId);
                 //更新文本內容,以符合選中項
                 tv.setText("您的性別是:" + rb.getText());
             }
         });
     }

進入主題

項目中有許多地方用到了RadioGroup和Fragment組合實現切換類似於微博、微信底部的切換

案例1彷微信底部欄

ViewPager+RadioGroup+Fragment 超高仿微信主界面,可通過左右滑動或點擊底部RadioButton切換

這裡寫圖片描述

activity_main.xml<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvcD4NCjxwcmUgY2xhc3M9"brush:java;">

style.xml

  

      

  

MainActivity.Java

package com.example.administrator.first.activity;  

import android.os.Bundle;  
import android.support.v4.app.Fragment;  
import android.support.v4.app.FragmentActivity;  
import android.support.v4.view.ViewPager;  
import android.widget.RadioButton;  
import android.widget.RadioGroup;  

import com.example.administrator.first.R;  
import com.example.administrator.first.adapter.myFragmentPagerAdapter;  
import com.example.administrator.first.fragment.ContactsFragment;  
import com.example.administrator.first.fragment.DiscoveryFragment;  
import com.example.administrator.first.fragment.MeFragment;  
import com.example.administrator.first.fragment.WeChatFragment;  

import java.util.ArrayList;  


public class MainActivity extends FragmentActivity{  
    private ViewPager mPager;  
    private RadioGroup mGroup;  
    private RadioButton rbChat,rbContacts,rbDiscovery,rbMe;  
    private ArrayList fragmentList;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        //初始化界面組件  
        initView();  
        //初始化ViewPager  
        initViewPager();  
    }  

    private void initView(){  
        mPager=(ViewPager)findViewById(R.id.viewPager);  
        mGroup=(RadioGroup)findViewById(R.id.radiogroup);  
        rbChat=(RadioButton)findViewById(R.id.rb_chat);  
        rbContacts=(RadioButton)findViewById(R.id.rb_contacts);  
        rbDiscovery=(RadioButton)findViewById(R.id.rb_discovery);  
        rbMe=(RadioButton)findViewById(R.id.rb_me);  
        //RadioGroup選中狀態改變監聽  
        mGroup.setOnCheckedChangeListener(new myCheckChangeListener());  
    }  

    private void initViewPager(){  
        WeChatFragment weChatFragment=new WeChatFragment();  
        ContactsFragment contactsFragment=new ContactsFragment();  
        DiscoveryFragment discoveryFragment=new DiscoveryFragment();  
        MeFragment meFragment=new MeFragment();  
        fragmentList=new ArrayList();  
        fragmentList.add(weChatFragment);  
        fragmentList.add(contactsFragment);  
        fragmentList.add(discoveryFragment);  
        fragmentList.add(meFragment);  
        //ViewPager設置適配器  
        mPager.setAdapter(new myFragmentPagerAdapter(getSupportFragmentManager(), fragmentList));  
        //ViewPager顯示第一個Fragment  
        mPager.setCurrentItem(0);  
        //ViewPager頁面切換監聽  
        mPager.setOnPageChangeListener(new myOnPageChangeListener());  
    }  

    /** 
     *RadioButton切換Fragment 
     */  
    private class myCheckChangeListener implements RadioGroup.OnCheckedChangeListener{  

        @Override  
        public void onCheckedChanged(RadioGroup group, int checkedId) {  
            switch (checkedId){  
                case R.id.rb_chat:  
                    //ViewPager顯示第一個Fragment且關閉頁面切換動畫效果  
                    mPager.setCurrentItem(0,false);  
                    break;  
                case R.id.rb_contacts:  
                    mPager.setCurrentItem(1,false);  
                    break;  
                case R.id.rb_discovery:  
                    mPager.setCurrentItem(2,false);  
                    break;  
                case R.id.rb_me:  
                    mPager.setCurrentItem(3,false);  
                    break;  
            }  
        }  
    }  

    /** 
     *ViewPager切換Fragment,RadioGroup做相應變化 
     */  
    private class myOnPageChangeListener implements ViewPager.OnPageChangeListener{  

        @Override  
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {  

        }  

        @Override  
        public void onPageSelected(int position) {  
            switch (position){  
                case 0:  
                    mGroup.check(R.id.rb_chat);  
                    break;  
                case 1:  
                    mGroup.check(R.id.rb_contacts);  
                    break;  
                case 2:  
                    mGroup.check(R.id.rb_discovery);  
                    break;  
                case 3:  
                    mGroup.check(R.id.rb_me);  
                    break;  
            }  
        }  

        @Override  
        public void onPageScrollStateChanged(int state) {  

        }  
    }  
}  

myFragmentPagerAdapter

package com.example.administrator.first.adapter;  

import android.support.v4.app.FragmentManager;  
import android.support.v4.app.Fragment;  
import android.support.v4.app.FragmentPagerAdapter;  

import java.util.ArrayList;  

/** 
 * Created by Administrator on 2015/6/24. 
 */  
public class myFragmentPagerAdapter extends FragmentPagerAdapter {  
    ArrayList list;  
    public myFragmentPagerAdapter(FragmentManager fm, ArrayList list){  
        super(fm);  
        this.list=list;  
    }  
    @Override  
    public Fragment getItem(int position) {  
        return list.get(position);  
    }  

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

拓展:
在MainActivity中實例化各個Fragment和RadioButton和RadioParent的控件,設置好監聽器。在這裡我定義了一個switchFragment()的方法,判斷切換的Fragment是否已經添加過,避免每一次切換Fragment的時候都調用add()或者replace(),而是通過hide()和show(),減少頻繁地創建新的實例。

private void switchFragment(Fragment fragment) {
      //判斷當前顯示的Fragment是不是切換的Fragment
      if(mFragment != fragment) {
          //判斷切換的Fragment是否已經添加過
          if (!fragment.isAdded()) {
              //如果沒有,則先把當前的Fragment隱藏,把切換的Fragment添加上
              getSupportFragmentManager().beginTransaction().hide(mFragment)
                      .add(R.id.main_fragment,fragment).commit();
          } else {
              //如果已經添加過,則先把當前的Fragment隱藏,把切換的Fragment顯示出來
              getSupportFragmentManager().beginTransaction().hide(mFragment).show(fragment).commit();
          }
          mFragment = fragment;
      }
  }

案例2底部欄

這裡寫圖片描述
實現思路

從圖我們基本猜到基本思路如下:
底部選項卡可以使用3個RadioButton組成,並綁定相關的監聽器以監聽tab切換。
選項卡的上面的部分為一個容器(FrameLayout)以存取3個fragment,可以在tab綁定的監聽器中去控制fragment的顯示。

布局文件

R.layout.activity_main




    

        

        

        
    

    <framelayout android:id="@+id/fl_contain" android:layout_above="@id/ll_rbtn_contain" android:layout_alignparenttop="true" android:layout_height="match_parent" android:layout_width="match_parent">
    </framelayout>

根視圖為相對布局以控制RadioGroup在底部,FrameLayout在RadioGroup的上面

設置選項卡Style

每個RadioButton都設置了統一的tab_style

設置選項卡icon的背景

每個radioButton都設置了Android:drawableTop屬性,只要創建三個drawable文件即可 eg :tab_first_background.xml



    
    
    

設置選項卡title的背景

除了選顯卡對應的icon要改變外,其對應的title的字體顏色也要隨之改變。注意要在res下創建color文件夾並將顏色狀態配置文件放在此文件夾下。eg:radio_colors.xml


    
    
    

Main.java

package com.example.tabapp;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.FrameLayout;
import android.widget.RadioButton;


public class MainActivity extends FragmentActivity implements OnCheckedChangeListener{
    //三個選項卡
    private RadioButton mRBtnFrist;
    private RadioButton mRBtnSecond;
    private RadioButton mRBtnThrid;

    //存放fragment對應的容器
    private FrameLayout mFragmentContain;

    private TabFragment mFirstFragment;
    private TabFragment mSecondFragment;
    private TabFragment mThirdFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        mFragmentContain = (FrameLayout)findViewById(R.id.fl_contain);
        mRBtnFrist = (RadioButton)findViewById(R.id.rb_first);
        mRBtnSecond = (RadioButton)findViewById(R.id.rb_second);
        mRBtnThrid = (RadioButton)findViewById(R.id.rb_thrid);

        mRBtnThrid.setOnCheckedChangeListener(this);
        mRBtnThrid.performClick();//此處設置默認第三個選項卡對應的fragment顯示
        mRBtnFrist.setOnCheckedChangeListener(this);
        mRBtnSecond.setOnCheckedChangeListener(this);
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            //用戶當前浏覽的選項卡
            int checkedWidgetId = buttonView.getId();
            mRBtnFrist.setChecked(checkedWidgetId == R.id.rb_first);
            mRBtnSecond.setChecked(checkedWidgetId == R.id.rb_second);
            mRBtnThrid.setChecked(checkedWidgetId == R.id.rb_thrid);
            showFragment(checkedWidgetId);
        }else {
            //此處記錄了用戶上次浏覽的選項卡
            String unCheckFragmentTag = getTagById(buttonView.getId());
            TabFragment unCheckFragment = (TabFragment)getSupportFragmentManager().findFragmentByTag(unCheckFragmentTag);
            if(unCheckFragment != null){
                //隱藏上次顯示到fragment,確保fragment不會重疊
                getSupportFragmentManager()
                    .beginTransaction()
                    .hide(unCheckFragment)
                    .commit();
            }
        }
    }

    /**
     * 顯示對應的fragment
     * @param checkedRadioBtnId
     */
    private void showFragment(int checkedRadioBtnId){
        String tag = getTagById(checkedRadioBtnId);
        TabFragment mainFragment = (TabFragment) getSupportFragmentManager().findFragmentByTag(tag);
        if(mainFragment == null){
            //如果沒有找到對應的fragment則生成一個新的fragment,並添加到容器中
            TabFragment newFragment = new TabFragment(tag);
            getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.fl_contain, newFragment, tag)
                .commit();
        }else {
            //如果找到了fragment則顯示它
            getSupportFragmentManager()
                .beginTransaction()
                .show(mainFragment)
                .commit();
        }
    }

    /**
     * 為三個fragment分別取三個不同到tag名
     * @param widgetId
     * @return
     */
    private String getTagById(int widgetId){
        if(widgetId == R.id.rb_first){
            return "first";
        }else if(widgetId == R.id.rb_second){
            return "second";
        }else {
            return "thrid";
        }
    }
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved