Android DeskClock源码分析之旅---DeskClock.java

本文详细分析了Android DeskClock应用的主Activity——DeskClock.java,重点探讨了onCreate()方法中如何初始化界面、设置选中标签、Actionbar与ViewPager的交互。通过设置OffscreenPageLimit提高界面流畅度,并介绍了ActionBar与ViewPager结合实现Tab导航的基本原理。
摘要由CSDN通过智能技术生成

分析整个Android DeskClock的Android Manifest文件之后,从应用程序组件开始分析,当然第一个组件就是Activity之DeskClock。

分析一个Activity,从固定的复写函数入手。

    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        //mIsFirstLaunch = (icicle == null);
        //getWindow().setBackgroundDrawable(null);

        //mIsFirstLaunch = true;
        //首先将选中的TAB直接置为1 即所有的TAB默认显示1
        mSelectedTab = CLOCK_TAB_INDEX;
        //如果icicle这个参数不是null,则选中的TAB显示为icicle里面带的参数
        if (icicle != null) {
            mSelectedTab = icicle.getInt(KEY_SELECTED_TAB, CLOCK_TAB_INDEX);
            android.util.Log.i("LYG","onCreate mSelectedTab = " + mSelectedTab);
        }

        // Timer receiver may ask the app to go to the timer fragment if a timer expired
        //当设定的计时器期满时,计时器接收者可能会打开计时器的分支
        //首先获取intent,如果intent不是空,获取intent携带的EXTRA
        //默认选取的值为-1,如果不是默认值,让当前选择的TAB选择为intent中携带的有关TAB信息
        Intent i = getIntent();
        if (i != null) {
            int tab = i.getIntExtra(SELECT_TAB_INTENT_EXTRA, -1);
            if (tab != -1) {
                mSelectedTab = tab;
            }
        }
        
        
        //初始化整个界面
        initViews();
        //设置家中时区
        setHomeTimeZone();

        // We need to update the system next alarm time on app startup because the
        // user might have clear our data.
        //我们需要更新系统下次的闹钟时间在app启动时,因为用户可能会清理掉data
        AlarmStateManager.updateNextAlarm(this);
        ExtensionsFactory.init(getAssets());
    }


关注        initViews();
    

private void initViews() {
        //通过语言判断当前是否需要作出布局调整
        int layoutDrection = TextUtils.getLayoutDirectionFromLocale(Locale.getDefault());
 
        if( 1== layoutDrection){
            AgoldIsRTL = true;
        }else{
            AgoldIsRTL = false;
        }
        //到这里是根据语言判断是不是需要作出左右布局调整的问题
        
        android.util.Log.i("SHN"," AgoldIsRTL = " + AgoldIsRTL);
        android.util.Log.i("SHN","################ layoutDrection = " + layoutDrection);
        
        
        //Actionbar的实例化
        //配置新的ActionbarAdapter
        //在Adapter上设置Listener
        mActionBar = getActionBar();        
        mActionBarAdapter = new AgoldActionBarAdapter(this, mActionBar,AgoldIsRTL);
        mActionBarAdapter.setListener(this);
        
        //创建新的ViewPagerAdapter实例
        //创建新的ViewPager实例
        //对新的ViewPager实例设置组件id
        //初始化ViewPager 以及 ActionBarAdapter ViewPagerAdapter
        if(mViewPagerAdapter == null){
            mViewPagerAdapter = new ViewPagerAdapter(getFragmentManager());
            mViewPager = new ViewPager(this);
            mViewPager.setId(R.id.desk_clock_pager);
            // Keep all four tabs to minimize jank.
            mViewPager.setOffscreenPageLimit(3);
            mViewPager.setAdapter(mViewPagerAdapter);
            mViewPager.setOnPageChangeListener(mPageChangeListener);
    
            mViewPager.setCurrentItem(mSelectedTab);
            
            mActionBarAdapter.setCurrentTab(mSelectedTab);
            mViewPagerAdapter.notifyPageChanged(mSelectedTab);
        }
        //最后setContentView
        setContentView(mViewPager);
    }


    主页主要是由Action bar ,ViewPager 和FragmentPagerAdapter 三部分组合而成的,通过四个Action bar TAB和抽象过的Fragment由自定义的FragmentPagerAdapter适配器来完成DeskClock中四个主要功能的切换.

    在DeskClock被创建的时候会先取得一个ActionBar被选中显示的标识位置,再去初始化Views.这里需要注意的是该ViewPager通过setOffscreenPageLimit方法来设置预加载的Fragment,这里是四个主要的fragment,DeskClock显示一个fragment,再预加载另外3个fragment来提高UI显示的流畅度.
    
    
           if (mTabsAdapter == null) {
            mViewPager = new ViewPager(this);
            mViewPager.setId(R.id.desk_clock_pager);
            // Keep all four tabs to minimize jank.
            mViewPager.setOffscreenPageLimit(3);
            mTabsAdapter = new TabsAdapter(this, mViewPager);
            createTabs(mSelectedTab);
        }
        setContentView(mViewPager);
        
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值