zoukankan      html  css  js  c++  java
  • 仿微信主页的切换

    0.效果

                                

    1.创建首页的Activity

    public class MaintabActivity extends FragmentActivity implements OnTabChangeListener {
        
        private FragmentTabHost tabHost;
        
        //定义 每个Tab的 Tag  --- start
        private final static String TAG_CHAT = "chat";
        
        private final static String TAG_CONTACTS = "contacts";
        
        private final static String TAG_DISCOVER = "discover";
        
        private final static String TAG_ME = "me";
        // 定义 每个Tab的 Tag  --- end
        
        // 定义 每个Tab展示的View   --- start
        private TabIndicator chatIndicator;
        
        private TabIndicator contactsIndicator;
        
        private TabIndicator discoverIndicator;
        
        private TabIndicator meIndicator;
        // 定义 每个Tab展示的View   --- end
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            
            setContentView(R.layout.activity_main);
            
            initIndicator();
            
            initTabHost();
        }
        
        /**
         * 初始化 TabHost
         */
        private void initTabHost() {
            // 1. 初始化TabHost
            tabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
            tabHost.setup(this, getSupportFragmentManager(), R.id.homeTabContent);
            
            // 2.1 创建聊天TabSpec
            TabSpec chatTabSpec = tabHost.newTabSpec(TAG_CHAT);
            chatTabSpec.setIndicator(chatIndicator);
            
            // 2.2 创建联系人TabSpec
            TabSpec contactsTabSpec = tabHost.newTabSpec(TAG_CONTACTS);
            contactsTabSpec.setIndicator(contactsIndicator);
            
            // 2.3 创发现TabSpec
            TabSpec discoverTabSpec = tabHost.newTabSpec(TAG_DISCOVER);
            discoverTabSpec.setIndicator(discoverIndicator);
            
            // 2.4 创我TabSpec
            TabSpec meTabSpec = tabHost.newTabSpec(TAG_ME);
            meTabSpec.setIndicator(meIndicator);
            
            // 3. 添加 TabSpec
            tabHost.addTab(chatTabSpec,ChatFragment.class,null);
            tabHost.addTab(contactsTabSpec,ContactsFragment.class,null);
            tabHost.addTab(discoverTabSpec,DiscoverFragment.class,null);
            tabHost.addTab(meTabSpec,MeFragment.class,null);
            
            // 4.去掉 每个Tab后面的 竖线
            tabHost.getTabWidget().setDividerDrawable(null);
            
            // 5. 设置初始化选中的Tab 
            tabHost.setCurrentTabByTag(TAG_CHAT);
            chatIndicator.setCurrentFocus(true);
            
            // 6.给每个Tab添加监听器
            tabHost.setOnTabChangedListener(this);
        }
        
        /**
         * 初始化每个需要展示的View
         */
        private void initIndicator(){
            chatIndicator = new TabIndicator(this);
            chatIndicator.setTabHit("微信");
            chatIndicator.setTabIcon(R.drawable.tab_icon_chat_normal, R.drawable.tab_icon_chat_focus);
            
            contactsIndicator = new TabIndicator(this);
            contactsIndicator.setTabHit("通讯录");
            contactsIndicator.setTabIcon(R.drawable.tab_icon_contact_normal, R.drawable.tab_icon_contact_focus);
            contactsIndicator.setUnread(1);
            
            discoverIndicator = new TabIndicator(this);
            discoverIndicator.setTabHit("发现");
            discoverIndicator.setTabIcon(R.drawable.tab_icon_discover_normal, R.drawable.tab_icon_discover_focus);
            
            meIndicator = new TabIndicator(this);
            meIndicator.setTabHit("我");
            meIndicator.setTabIcon(R.drawable.tab_icon_me_normal, R.drawable.tab_icon_me_focus);
        }
        
        /**
         * 每个Tab的点击监听
         */
        @Override
        public void onTabChanged(String tabId) {
            
            buildIndicator();
            
            // 点击微信的Tab
            if(tabId.equals(TAG_CHAT)){
                chatIndicator.setTabSelected(true);
            }
            
            // 点击联系人的Tab
            if(tabId.equals(TAG_CONTACTS)){
                contactsIndicator.setTabSelected(true);
            }
            
            // 点击发现的Tab
            if(tabId.equals(TAG_DISCOVER)){
                discoverIndicator.setTabSelected(true);
            }
            
            // 点击我的Tab
            if(tabId.equals(TAG_ME)){
                meIndicator.setTabSelected(true);
            }
        }
        
        /**
         * 点击之后先将全部的设置为非点击状态
         */
        private void buildIndicator() {
            chatIndicator.setTabSelected(false);
            contactsIndicator.setTabSelected(false);
            discoverIndicator.setTabSelected(false);
            meIndicator.setTabSelected(false);
        }
    }

    创建首页Activity的布局页面

    <?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:orientation="vertical" >
    
        <FrameLayout
            android:id="@+id/homeTabContent"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    
        <android.support.v4.app.FragmentTabHost
            android:id="@android:id/tabhost"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
    
            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:background="#FFF1F1F1" />
    
            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_weight="0" />
        </android.support.v4.app.FragmentTabHost>
    </LinearLayout>

    2.创建每个Tab显示的自定义View,在layout目录下新建tab_indicator.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="54dip"
        android:layout_marginLeft="-3dip"
        android:layout_marginRight="-3dip"
        android:layout_weight="1" >
    
        <LinearLayout
            android:id="@+id/ll_tab_info"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="vertical" >
    
            <ImageView
                android:id="@+id/tab_indicator_icon"
                android:layout_width="34dp"
                android:layout_height="34dp"
                android:contentDescription="@null"
                android:src="@drawable/tab_icon_me_normal" />
    
            <TextView
                android:id="@+id/tab_indicator_hint"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="aaaa"
                android:textSize="12sp" />
        </LinearLayout>
    
        <TextView
            android:id="@+id/tab_indicator_unread"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignRight="@id/ll_tab_info"
            android:layout_marginRight="3dp"
            android:layout_marginTop="3dp"
            android:background="@drawable/action_unread_icon"
            android:gravity="center"
            android:text="1"
            android:textColor="#ffffffff"
            android:textSize="10sp" />
    </RelativeLayout>

    创建自定义View对象

    /**
     * 创建自定义View
     * @author chenhao24
     *
     */
    public class TabIndicator extends RelativeLayout {
    
        private ImageView ivTabIcon;
    
        private TextView tvTabHint;
    
        private TextView tvTabUnRead;
    
        private int focusId = -1;
        
        private int normalId = -1;
    
        private int unreadCount = 0;
    
        public TabIndicator(Context context) {
            this(context, null);
        }
    
        public TabIndicator(Context context, AttributeSet attrs) {
            super(context, attrs);
    
            View.inflate(context, R.layout.tab_indicator, this);
            
            ivTabIcon = (ImageView) findViewById(R.id.tab_indicator_icon);
            
            tvTabHint = (TextView) findViewById(R.id.tab_indicator_hint);
            
            tvTabUnRead = (TextView) findViewById(R.id.tab_indicator_unread);
    
            setUnread(0);
        }
    
        public void setTabIcon(int normalId, int focusId) {
            this.normalId = normalId;
            this.focusId = focusId;
        }
    
        public void setTabHit(String text) {
            tvTabHint.setText(text);
        }
    
        public void setUnread(int unreadCount) {
            this.unreadCount = unreadCount;
    
            if (unreadCount <= 0) {
                tvTabUnRead.setVisibility(View.GONE);
            } else {
                if (unreadCount >= 100) {
                    tvTabUnRead.setText("99+");
                } else {
                    tvTabUnRead.setText("" + unreadCount);
                }
                tvTabUnRead.setVisibility(View.VISIBLE);
            }
        }
    
        public int getUnreadCount() {
            return this.unreadCount;
        }
    
        public void setCurrentFocus(boolean current) {
            if (current) {
                if (focusId != -1) {
                    ivTabIcon.setImageResource(focusId);
                }
            } else {
                if (normalId != -1) {
                    ivTabIcon.setImageResource(normalId);
                }
            }
        }
    
        // 设置选中
        public void setTabSelected(boolean selected) {
            if (selected) {
                ivTabIcon.setImageResource(focusId);
            } else {
                ivTabIcon.setImageResource(normalId);
            }
        }
    }

    3. 创建几个展示区域的自定义Fragment

    public class ChatFragment extends Fragment{
        
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
            
            View view = inflater.inflate(R.layout.show_info, container,false);
            
            TextView tvInfo = (TextView) view.findViewById(R.id.tv_info);
            
            tvInfo.setText("这里显示微信的列表");
            
            return view;
        }
    }
    public class ContactsFragment extends Fragment{
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
            
            View view = inflater.inflate(R.layout.show_info, container,false);
            
            TextView tvInfo = (TextView) view.findViewById(R.id.tv_info);
            
            tvInfo.setText("这里显示联系人的列表");
            
            return view;
        }
    }
    public class DiscoverFragment extends Fragment{
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
            
            View view = inflater.inflate(R.layout.show_info, container,false);
            
            TextView tvInfo = (TextView) view.findViewById(R.id.tv_info);
            
            tvInfo.setText("这里显示发现的列表");
            
            return view;
        }
    }
    public class MeFragment extends Fragment{
        
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
            
            View view = inflater.inflate(R.layout.show_info, container,false);
            
            TextView tvInfo = (TextView) view.findViewById(R.id.tv_info);
            
            tvInfo.setText("这里显示我的列表");
            
            return view;
        }
    }

    简单的布局

    <?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:layout_gravity="center"
        android:orientation="vertical" >
        <TextView
            android:id="@+id/tv_info"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="内容显示区域" />
    </LinearLayout>

    相关资源文件

     可能会遇到的错误:

    java.lang.IllegalStateException: No tab content FrameLayout found for id xxxxx

    解决:换个新的android-support-v4.jar,覆盖原来的

    代码地址: https://github.com/cbooy/FragmentTabHostDemo

  • 相关阅读:
    驱动模块和装模块的概念——Junit单元测试案例
    虚拟机配置Openstack常见问题汇总
    Ubuntu配置OpenStack 二:配置时间同步NTP和安装数据库Maridb以及问题总结
    Ubuntu配置OpenStack 一:主机环境配置以及问题总结
    Eclipse连接SQL Server 2008数据库 以及问题总结
    linux信号与trap命令
    shell之数组
    wget下载命令 与功能更强大的 curl 文件传输命令
    RSync 文件备份同步
    rhel7和centos7的新防火墙软件 firewalld
  • 原文地址:https://www.cnblogs.com/cbooy/p/4783913.html
Copyright © 2011-2022 走看看