0
点赞
收藏
分享

微信扫一扫

SpintNBA项目模仿笔记(二) 主页的一些设置


Toolbar动态设置图标

自从用了Toolbar以后,很少用Actionbar的方式设置右上角的图标了。其实如果只是图片设置,对于一些简单应用可以满足基本需求,当做复习,这部分单独写一篇。

源码摘抄:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.clear();
MenuInflater inflater = this.getMenuInflater();
switch (mCurrentMenuCheckedPos) {
case 1:
inflater.inflate(R.menu.menu_schedule, menu);
break;
default:
//inflater.inflate(R.menu.menu_home, menu);
break;
}
return super.onPrepareOptionsMenu(menu);
}

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


@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mActionBarDrawerToggle != null && mActionBarDrawerToggle.onOptionsItemSelected(item)) {
return true;
}

switch (item.getItemId()) {
case R.id.action_calendar:
CalendarActivity.start(this, REQUEST_DATE_CODE);
break;
case R.id.action_live:
MatchVideoLiveListActivity.start(this);
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}

这里做个说明:
onPrepareOptionsMenu(),菜单预设,可选菜单布局,之后将菜单布局的内容作为选项内容,这里的mCurrentMenuCheckedPos指的是选到哪个fragment

onCreateOptionsMenu() 选择菜单布局

onOptionsItemSelected() 根据选项内容,进行相应操作,这里要注意,此处的选择可能是左上角menu键,前面的return true就是为了这个,menu键的设置在ActionBarDrawerToggle当做,所以此处不做设置。

自以为看懂了,然后拷贝出来,用在侧滑菜单那里,然后发现。。。选了右上角没反应,好忧伤。。。于是在源码中一句一句注释尝试,终于让我找到了,是mViewPager.setCurrentItem(mCurrentMenuCheckedPos, true);这一句,现在先试下.
此处间隔三个小时。。。。

找到了,这个方法叫做invalidateOptionsMenu();
调用这个会系统会重新调用onCreateOptionsMenu()onPrepareOptionsMenu()
位置在ScheduleFragment的setUserVisibleHint(boolean isVisibleToUser)

这里,我提一下我找这个的思路:
(1)前文说到,我发现是在mViewPager.setCurrentItem(mCurrentMenuCheckedPos, true);之后成功调用的,于是找作者的自定义viewpager,木有
(2)找它的menu的xml调用类,如果未直接关联应该和这个相关,木有
(3)想一下setCurrentItem,可能调用监听器,再找viewpager的OnPageChangeListener,木有
(4)此处卡住10分钟,想到viewpager切换,可能和fragment有关,而通过调试发现每个页都有调用到onCreateOptionsMenu,那么可能在fragment公共父类里面,木有
(5)不在父类,只能在子类了,于是找到了

其实中途我有百度过一段时间,可惜好多看到的都是自定义Toolbar,或者是只能调用一次,于是还是乖乖的回家找源码了。

DrawerLayout+Toobar菜单按钮旋转

为Toolbar添加ActionBarDrawerToggle

private boolean toggleOpen = false;

private ActionBarDrawerToggle mDrawerToggle;

private ActionBarDrawerToggle getToggle() {
if (mDrawerToggle == null) {
mDrawerToggle = new ActionBarDrawerToggle(this, mainDrawer, commonToolbar, R.string.open, R.string.close) {
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
toggleOpen = true;
}

@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
toggleOpen = false;
}
};
}
return mDrawerToggle;
}

private void initDrawerToggle() {
getToggle().syncState();
mainDrawer.addDrawerListener(getToggle());
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
getToggle().syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
getToggle().onConfigurationChanged(newConfig);
}

private void initToolbarListener() {
initDrawerToggle();
}

private void toggle() {
if (toggleOpen) {
closeMenu();
} else {
openMenu();
}
}

private void closeMenu() {
if (toggleOpen) {
mainDrawer.closeDrawer(Gravity.LEFT);
}
}

private void openMenu() {
if

上面的代码从initToolbarListener()开始看,就可见到一些设置,toggle方法主要是侧滑菜单选中时菜单收起用的,有一个状态的判断。
个别系统方法:

onPostCreate(Bundle savedInstanceState)
Activity彻底运行起来后会调用该方法,可用于获取view宽高等需要运行起来后再进行的操作。

onConfigurationChanged(Configuration newConfig)
menu配置android:configChanges后生效,最常调用的时机是弹出或隐藏软键盘或者旋转屏幕

模仿项目地址:​​https://github.com/nfwuzhongdemeng/ImitateNBA​​​
原项目地址:​​​https://github.com/smuyyh/SprintNBA​​


举报

相关推荐

0 条评论