zoukankan      html  css  js  c++  java
  • 仿微信底部导航栏的实现

    使用ViewPager+RadioGroup实现仿微信底部导航栏

    先看效果图:

    PS:本案例使用Android Studio2.2.3开发.

    本案例很简单,底部使用了RadioGroup+四个RadioButton作为导航栏,写了四个Drawable,用来显示选中和没选中底下导航栏的背景.

    上面使用了ViewPager控件实现与下方导航栏的联动.

    先贴一下前台代码:

    MainActivity.xml:

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="me.worldskills.android.testdemo.MainActivity">
    
        <android.support.v4.view.ViewPager
            android:id="@+id/main_vp"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"></android.support.v4.view.ViewPager>
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#e1e1e1"/>
    
        <RadioGroup
            android:id="@+id/main_rg"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <RadioButton
                android:id="@+id/rbChat"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:button="@null"
                android:drawableTop="@drawable/selector_chats"
                android:gravity="center"
                android:text="Chats"
                android:textColor="@android:color/darker_gray"/>
    
            <RadioButton
                android:id="@+id/rbContact"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:button="@null"
                android:drawableTop="@drawable/selector_contacts"
                android:gravity="center"
                android:text="Contacts"
                android:textColor="@android:color/darker_gray"/>
    
            <RadioButton
                android:id="@+id/rbDiscover"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:button="@null"
                android:drawableTop="@drawable/selector_discover"
                android:gravity="center"
                android:text="Discover"
                android:textColor="@android:color/darker_gray"/>
    
            <RadioButton
                android:id="@+id/rbMe"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:button="@null"
                android:drawableTop="@drawable/selector_me"
                android:gravity="center"
                android:text="Me"
                android:textColor="@android:color/darker_gray"/>
        </RadioGroup>
    </LinearLayout>
    

    前台比较简单了,就不细说了,贴一下使用到的Drawable,因为代码差不多,就贴一个,其他改一下显示的图片就行:

    selector_chats

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@mipmap/chat_press" android:state_checked="true"></item>
        <item android:drawable="@mipmap/chat_normal" android:state_checked="false"></item>
    </selector>
    

    这里用了个标签,选中的时候和未选中的时候显示不同的图片即可

    然后我们来看看后台代码:

    MainActivity.java:

    public class MainActivity extends AppCompatActivity {
    
        ViewPager viewPager;
        List<View> lsViews = new ArrayList<>();//声明ViewPager需要使用的View对象
        MyPagerAdapter pagerAdapter;//声明适配器对象
        RadioButton rbChat, rbContact, rbDiscover, rbMe;
        RadioGroup radioGroup;
    
        @Override
        protected void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //Initialise Views
            viewPager = (ViewPager) findViewById(R.id.main_vp);
            radioGroup = (RadioGroup) findViewById(R.id.main_rg);
            rbChat = (RadioButton) findViewById(R.id.rbChat);
            rbContact = (RadioButton) findViewById(R.id.rbContact);
            rbDiscover = (RadioButton) findViewById(R.id.rbDiscover);
            rbMe = (RadioButton) findViewById(R.id.rbMe);
            rbChat.setChecked(true);
    
            lsViews.add(getLayoutInflater().inflate(R.layout.page_chats, null, false));
            lsViews.add(getLayoutInflater().inflate(R.layout.page_contacts, null, false));
            lsViews.add(getLayoutInflater().inflate(R.layout.page_discover, null, false));
            lsViews.add(getLayoutInflater().inflate(R.layout.page_me, null, false));
            pagerAdapter = new MyPagerAdapter(lsViews);
            viewPager.setAdapter(pagerAdapter);
            viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
                }
    
                //选中ViewPage页的时候触发该事件
                @Override
                public void onPageSelected(int position) {
                    switch (position) {
                        case 0://Chats
                            rbChat.setChecked(true);
                            break;
                        case 1://Contacts
                            rbContact.setChecked(true);
                            break;
                        case 2://Discover
                            rbDiscover.setChecked(true);
                            break;
                        case 3://Me
                            rbMe.setChecked(true);
                            break;
                    }
                }
    
                @Override
                public void onPageScrollStateChanged(int state) {
    
                }
            });
    
            //设置Radio选中的时候切换ViewPager
            radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(RadioGroup radioGroup, int i) {
                    switch (i) {
                        case R.id.rbChat:
                            viewPager.setCurrentItem(0);
                            break;
                        case R.id.rbContact:
                            viewPager.setCurrentItem(1);
                            break;
                        case R.id.rbDiscover:
                            viewPager.setCurrentItem(2);
                            break;
                        case R.id.rbMe:
                            viewPager.setCurrentItem(3);
                            break;
                    }
                }
            });
        }
    }
    

    里面通过监听RadioGroup的子项选择事件和ViewPager的切换监听实现底部导航栏和ViewPager的联动

    里面使用到了一个PagerAdapter,也贴一下代码:

    public class MyPagerAdapter extends PagerAdapter {
    
        List<View> lsViews = new ArrayList<>();//存储ViewPager需要的View
    
        //构造方法,用来传递View列表
        public MyPagerAdapter(List<View> lsViews) {
            this.lsViews = lsViews;
        }
    
        //更新视图数据
        public void Update(List<View> lsViews) {
            this.lsViews = lsViews;
        }
    
        //获得视图数量
        @Override
        public int getCount() {
            return lsViews.size();
        }
    
        //用来判断当前视图是否需要缓存
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }
    
        //翻页的时候移除之前的视图
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView(lsViews.get(position));
        }
    
        //翻页的时候加载新的视图
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            container.addView(lsViews.get(position));
            return lsViews.get(position);
        }
    }
    

    好了,就这么多了~

    案例下载地址:http://download.csdn.net/download/garnett_nirvana/9981559

    Everything has its time and that time must be watched. If you have any question, please contact email linqtosql@qq.com.
  • 相关阅读:
    CentOS 基本设置
    CentOS 7 编译安装 Code::Blocks
    Java和C/C++进行DES/AES密文传输(借鉴)
    VS 2010 编译 Openssl
    Crypto++ 动态链接编译与实例测试
    c++11-bind的用法
    模板编程-迭代器
    LeetCode-Swap Nodes in Pairs
    LeetCode-Generate Parentheses
    Leetcode-Letter Combinations of a Phone Number
  • 原文地址:https://www.cnblogs.com/Fill/p/7530655.html
Copyright © 2011-2022 走看看