SmartTabLayout-master Demo设计浅谈

    Demo使用ListView作为整体Demo列表,罗列出整个demo的效果,点击每一个列表项,便可启动对应的Demo效果。

    Demo的亮点是作者使用jdk1.5提供的枚举特性实现了对ListView的列表项内容的填充,在此处作者定义了一个包含两个属性的枚举类。
        public enum Demo {

             . . . 

             public final int titleResId;
             public final int layoutResId;

             Demo(int titleResId, int layoutResId) {
                this.titleResId = titleResId;
                this.layoutResId = layoutResId;
              }
             . . .
        }
    作者在此处使用该枚举方式处理不同demo效果和标题不同的问题。在定义枚举时传递标题和内容布局的资源id,如下所示:
BASIC(R.string.demo_title_basic, R.layout.demo_basic),
    在ListView的item点击监听部分,作者利用了枚举和ListView里面Item都是从0位置开始的特性,并且在枚举中定义了启动对应activity的方法,聪明的解决了启动不同activity的繁琐,大大减少了代码量。如下所示:

MainActivitiy中:
    利用每一个枚举对象都是一个单独的枚举实例这一个特性来通过不同的枚举启动对应的实例
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Demo demo = Demo.values()[position];
        demo.startActivity(this);
    }
Demo枚举中:
    每个枚举实例会调用该方法将自身实例传递进去,该自身实例包括了Demo的标题和Demo的布局。
    调用DemoActivitiy的startActivity方法来启动展示Demo的Activity实例。每个实例都会获得对应标题和内容布局的枚举实例。
    public void startActivity(Context context) {
        DemoActivity.startActivity(context, this);
    }
在承载Demo的Activity中:
    每次调用该方法,都会启动一个同一个Activity的新的实例,因为每次传递的枚举实例的内容不同,因此就可以在每次启动的时候通过布局加载器,加载不同的Demo内容。在Intent中,将枚举实例的名称传递进去。在新启动的activity中可以通过该枚举名称获取对应的布局,同时该枚举名称亦可以作为新Activity实例的标题。
    public static void startActivity(Context context, Demo demo) {
        Intent intent = new Intent(context, DemoActivity.class);
        intent.putExtra(KEY_DEMO, demo.name());
        context.startActivity(intent);
    }
在承载Demo的Activity中:
    通过布局加载器加载对应枚举实例指向的布局,将其添加进对应的tab容器中,起到展示不同Demo效果的作用。
    Demo demo = getDemo();
    ViewGroup tab = (ViewGroup) findViewById(R.id.tab);
    tab.addView(LayoutInflater.from(this).inflate(demo.layoutResId, tab, false));

    private Demo getDemo() {
        return Demo.valueOf(getIntent().getStringExtra(KEY_DEMO));
    }
  如此,经过对枚举特性的充分使用,整个Demo的代码变得简单,同时却又尽显高手对程序结构设计功底。
完整样例代码:
枚举:Demo
package com.example.listview.demo;

import android.content.Context;
import android.content.res.Resources;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.example.listview.R;
import com.example.listview.SmartTabLayout;

public enum Demo {

    BASIC(R.string.demo_title_basic, R.layout.demo_basic),

    SMART_INDICATOR(R.string.demo_title_smart_indicator, R.layout.demo_smart_indicator),

    DISTRIBUTE_EVENLY(R.string.demo_title_distribute_evenly, R.layout.demo_distribute_evenly) {
        @Override
        public int[] tabs() {
            return tab3();
        }
    },

    ALWAYS_IN_CENTER(R.string.demo_title_always_in_center, R.layout.demo_always_in_center),

    CUSTOM_TAB(R.string.demo_title_custom_tab_text, R.layout.demo_custom_tab_text),

    CUSTOM_TAB_COLORS(R.string.demo_title_custom_tab_colors, R.layout.demo_custom_tab_colors),

    CUSTOM_TAB_ICONS(R.string.demo_title_custom_tab_icons, R.layout.demo_custom_tab_icons) {
        @Override
        public int[] tabs() {
            return new int[] {
                    R.string.demo_tab_no_title,
                    R.string.demo_tab_no_title,
                    R.string.demo_tab_no_title,
                    R.string.demo_tab_no_title
            };
        }
        @Override
        public void setup(SmartTabLayout layout) {
            super.setup(layout);

            final LayoutInflater inflater = LayoutInflater.from(layout.getContext());
            final Resources res = layout.getContext().getResources();

            layout.setCustomTabView(new SmartTabLayout.TabProvider() {
                @Override
                public View createTabView(ViewGroup container, int position, PagerAdapter adapter) {
                    ImageView icon = (ImageView) inflater.inflate(R.layout.custom_tab_icon, container, false);
                    switch (position) {
                        case 0:
                            icon.setImageDrawable(res.getDrawable(R.drawable.ic_home_white_24dp));
                            break;
                        case 1:
                            icon.setImageDrawable(res.getDrawable(R.drawable.ic_search_white_24dp));
                            break;
                        case 2:
                            icon.setImageDrawable(res.getDrawable(R.drawable.ic_person_white_24dp));
                            break;
                        case 3:
                            icon.setImageDrawable(res.getDrawable(R.drawable.ic_flash_on_white_24dp));
                            break;
                        default:
                            throw new IllegalStateException("Invalid position: " + position);
                    }
                    return icon;
                }
            });
        }
    },

    INDICATOR_TRICK1(R.string.demo_title_indicator_trick1, R.layout.demo_indicator_trick1),

    INDICATOR_TRICK2(R.string.demo_title_indicator_trick2, R.layout.demo_indicator_trick2)
    ;

    public final int titleResId;
    public final int layoutResId;

    Demo(int titleResId, int layoutResId) {
        this.titleResId = titleResId;
        this.layoutResId = layoutResId;
    }

    public void startActivity(Context context) {
        DemoActivity.startActivity(context, this);
    }

    public void setup(final SmartTabLayout layout) {
        //Do nothing.
    }

    public int[] tabs() {
        return tab10();
    }

    public static int[] tab10() {
        return new int[]{
                R.string.demo_tab_1,
                R.string.demo_tab_2,
                R.string.demo_tab_3,
                R.string.demo_tab_4,
                R.string.demo_tab_5,
                R.string.demo_tab_6,
                R.string.demo_tab_7,
                R.string.demo_tab_8,
                R.string.demo_tab_9,
                R.string.demo_tab_10
        };
    }

    public static int[] tab3() {
        return new int[]{
                R.string.demo_tab_8,
                R.string.demo_tab_9,
                R.string.demo_tab_10
        };
    }

}
MainActivity:
package com.example.listview.demo;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.example.listview.R;

public class MainActivity extends ActionBarActivity implements AbsListView.OnItemClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //加载布局
        setContentView(R.layout.activity_main);

        //获取列表对象
        ListView listView = (ListView) findViewById(R.id.list);
        listView.setOnItemClickListener(this);

        ArrayAdapter<String> demoAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1);
        //设置adapter的值
        for (Demo demo : Demo.values()) {
            demoAdapter.add(getString(demo.titleResId));
        }
        //设置Adapter
        listView.setAdapter(demoAdapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_github:
                openGitHub();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Demo demo = Demo.values()[position];
        demo.startActivity(this);
    }

    private void openGitHub() {
        Uri uri = Uri.parse(getString(R.string.app_github_url));
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        startActivity(intent);
    }
}
DemoActivity:
package com.example.listview.demo;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.ViewGroup;

import com.example.listview.R;
import com.example.listview.SmartTabLayout;
import com.example.listview.utils_v4.v4.FragmentPagerItem;
import com.example.listview.utils_v4.v4.FragmentPagerItemAdapter;
import com.example.listview.utils_v4.v4.FragmentPagerItems;


public class DemoActivity extends ActionBarActivity {

    private static final String KEY_DEMO = "demo";

    public static void startActivity(Context context, Demo demo) {
        Intent intent = new Intent(context, DemoActivity.class);
        intent.putExtra(KEY_DEMO, demo.name());
        context.startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo);

        Demo demo = getDemo();

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle(demo.titleResId);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        ViewGroup tab = (ViewGroup) findViewById(R.id.tab);
        tab.addView(LayoutInflater.from(this).inflate(demo.layoutResId, tab, false));

        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        SmartTabLayout viewPagerTab = (SmartTabLayout) findViewById(R.id.viewpagertab);
        demo.setup(viewPagerTab);

        FragmentPagerItems pages = new FragmentPagerItems(this);
        for (int titleResId : demo.tabs()) {
            pages.add(FragmentPagerItem.of(getString(titleResId), DemoFragment.class));
        }

        FragmentPagerItemAdapter adapter = new FragmentPagerItemAdapter(
                getSupportFragmentManager(), pages);

        viewPager.setAdapter(adapter);
        viewPagerTab.setViewPager(viewPager);

    }

    private Demo getDemo() {
        return Demo.valueOf(getIntent().getStringExtra(KEY_DEMO));
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值