• Android Actionbar Tab 导航模式


    Android Actionbar Tab

    下图中,红色矩形圈起来的就是我们 ActionBar Tab,下面我们将一步一步的实现下图中的效果。

    初次尝试

    package com.example.it.studyactionbartab;
    
    import android.support.v7.app.ActionBar;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            String[] tabNames = {"收藏", "全部"};
    
            //使用getSupportActionBar可以有更好的兼容性
            ActionBar actionBar = this.getSupportActionBar();
            //设置当前的导航模式
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
            //添加Tab
            for (String name : tabNames) {
                actionBar.addTab(
                        actionBar.newTab()
                                .setText(name)
                );
            }
        }
    }
    
    

    发现问题

    上面的代码看起来已经没有异样了,我们来尝试运行,你就会发现是报错了。会出现一下的信息,ActionBar Tab 必须要有一个回调。

    解决问题

    我们回过头来看看我们的 Tab 还有哪些方法,看来也就是下图所矩形标注的这个方法像是回调函数,那么让我们来看看此方法的的说明。

    Set the ActionBar.TabListener that will handle switching to and from this tab. All tabs must have a TabListener set before being added to the ActionBar.

    设置一个 ActionBar.TabListener ,他将控制Tab的开关,所有的Tab必须具有 TabListener ,设置在Tab被添加到ActionBar之前。

    该方法,不出意外应该就是我们报错的原因,下面让我们来实现它。

    package com.example.it.studyactionbartab;
    
    import android.support.v4.app.FragmentTransaction;
    import android.support.v7.app.ActionBar;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    public class MainActivity extends AppCompatActivity implements ActionBar.TabListener {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            String[] tabNames = {"收藏", "全部"};
    
            //使用getSupportActionBar可以有更好的兼容性
            ActionBar actionBar = this.getSupportActionBar();
            //设置当前的导航模式为TAGS模式
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
            /*
            * 添加Tab
            * Note: 必须要添加一个TabListener
            * */
            for (String name : tabNames) {
                actionBar.addTab(
                        actionBar.newTab()
                                .setText(name)
                                .setTabListener(this)
    
                );
            }
        }
    
        /*
        * 当选中TAB 时触发的事件
        * */
        @Override
        public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
    
        }
    
        /*
        * 当 Tab取消选中时触发的事件
        * */
        @Override
        public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
    
        }
    
        /*
        * 当重复选中TAB时候触发的事件
        * */
        @Override
        public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
    
        }
    }
    
    

    完成功能

    既然涉及到了多个界面,那么就到我们的Fragment登场了。只是一个Demo就没有复杂的功能,所以一切从简哈。

    Note: 在这里 FragmentTransaction 不用提交,系统会自动的帮助我们提交,如果重复的提交就会,抛出异常。

    /*
    * 当选中TAB 时触发的事件
    * */
    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
        Fragment fragment = null;
        switch (String.valueOf(tab.getText())) {
            case "收藏":
                fragment = new FragmentCollect();
                break;
            case "全部":
                fragment = new FragmentAll();
                break;
        }
        ft.replace(R.id.activity_main, fragment);
       	// ft.commit();
    }
    

    可能遇到的Error

    说明 FragmentTransaction 的commit方法重复执行了,在这个回调用我们不需要,进行手动 commit() 系统会自动帮助我们commit().

    源码下载

    https://git.oschina.net/ShareKnowledge/android_actionbar_tab

  • 相关阅读:
    docker-compose.yml容器网络
    docker-compose搭建redis集群
    docker-compose简易搭建rabbitmq
    docker仓库快速搭建
    CNN是怎样一步步工作的?
    全连接层分类的原理
    vector中erase()与insert()用法
    MySQL安装教程
    红黑树与AVL树比较
    C++内存管理(超长,例子很详细,排版很好)
  • 原文地址:https://www.cnblogs.com/slyfox/p/7194549.html
Copyright © 2020-2023  润新知