XPOSED源码研究之XposedInstaller(3)XposedInstallerActivity
来源:互联网 发布:追信魔盒在线制作软件 编辑:程序博客网 时间:2024/06/07 10:57
XposedInstallerActivity集成自XposedDropdownNavActivity,本身代码较少,重点看下onCreate调用 的selectInitialTab,
上一节我们知道WelcomeActivity在启动XposedDropdownNavActivity时会传入一个EXTRA_SECTION参数,数值为ListView的Item索引。
package de.robv.android.xposed.installer; import java.util.HashMap; importandroid.content.Intent; import android.os.Bundle; public classXposedInstallerActivity extends XposedDropdownNavActivity { public static finalString EXTRA_SECTION = "section"; public static final String EXTRA_SECTION_LEGACY = "opentab"; private static final HashMap<String, Integer> TABS; static { TABS = newHashMap<String, Integer>(TAB_COUNT, 1); TABS.put("install", TAB_INSTALL); TABS.put("modules", TAB_MODULES); TABS.put("download", TAB_DOWNLOAD); TABS.put("logs", TAB_LOGS); TABS.put("settings", TAB_SETTINGS); TABS.put("about", TAB_ABOUT); } @Override public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); selectInitialTab(getIntent(), savedInstanceState); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("section", getActionBar().getSelectedNavigationIndex()); } private void selectInitialTab(Intent intent, Bundle savedInstanceState) { int selectTabIndex = -1; Bundle extras =intent.getExtras(); if (extras != null) { Object section = extras.get(EXTRA_SECTION);if (section == null) section = extras.get(EXTRA_SECTION_LEGACY); if (sectioninstanceof Integer) { selectTabIndex = (Integer) section; } else if (sectioninstanceof String && TABS.containsKey(section)) { selectTabIndex = TABS.get(section); } } if (selectTabIndex == -1 && savedInstanceState != null) selectTabIndex = savedInstanceState.getInt("section", -1); if (selectTabIndex >= 0 && selectTabIndex <TAB_COUNT) getActionBar().setSelectedNavigationItem(selectTabIndex); } }
getActionBar().setSelectedNavigationItem(selectTabIndex)
这个会调用ActionBar的onNavigationItemSelected或者回调,具体看看基类:XposedDropdownNavActivity。
XposedDropdownNavActivity在onCreate中通过getActionBar获取ActionBar,然后设置属性以及回调:
final ActionBar bar = getActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); bar.setDisplayShowTitleEnabled(false); bar.setDisplayHomeAsUpEnabled(true);
设置ActionBar为导航列表模式,图标区域可点击等,更多信息请参考:Android ActionBar使用方法
如何显示的下拉列表的内容呢:
SimpleAdapter adapter = new SimpleAdapter(getActionBar().getThemedContext(), navigationItemList, android.R.layout.simple_spinner_dropdown_item, new String[] { "title" }, new int[] { android.R.id.text1 });
bar.setListNavigationCallbacks(adapter, new OnNavigationListener() { @Override publicboolean onNavigationItemSelected(int itemPosition, long itemId) { if (currentNavItem == itemPosition) return true; if (navigateViaIntent()) { Intent intent = newIntent(XposedDropdownNavActivity.this, XposedInstallerActivity.class); intent.putExtra(XposedInstallerActivity.EXTRA_SECTION, itemPosition); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); finish();return true; } Map<String, Object> map = navigationItemList.get(itemPosition); String fragmentClass = (String) map.get("fragment_class"); Fragment fragment = Fragment.instantiate(XposedDropdownNavActivity.this, fragmentClass); FragmentTransaction tx = getFragmentManager().beginTransaction(); tx.replace(android.R.id.content, fragment); currentNavItem = itemPosition; tx.commit(); getFragmentManager().executePendingTransactions(); return true; } });
if (navigationItemList == null) { navigationItemList = new ArrayList<Map<String, Object>>(); navigationItemList.add(makeNavigationItem(getString(R.string.tabInstall), InstallerFragment.class)); navigationItemList.add(makeNavigationItem(getString(R.string.tabModules), ModulesFragment.class)); navigationItemList.add(makeNavigationItem(getString(R.string.tabDownload), DownloadFragment.class)); navigationItemList.add(makeNavigationItem(getString(R.string.tabSettings), SettingsFragment.class)); navigationItemList.add(makeNavigationItem(getString(R.string.tabLogs), LogsFragment.class)); navigationItemList.add(makeNavigationItem(getString(R.string.tabAbout), AboutFragment.class)); }
InstallerFragment、ModulesFragment、DownloadFragment、SettingsFragment、LogsFragment、AboutFragment,这个我们后面逐个分析。
最后处理菜单消息:
@Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { if(!getIntent().getBooleanExtra(NavUtil.FINISH_ON_UP_NAVIGATION, false)) { Intent parentIntent = getParentIntent(); parentIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(parentIntent); } finish(); NavUtil.setTransitionSlideLeave(this); return true; } returnsuper.onOptionsItemSelected(item); } protected Intent getParentIntent() { return newIntent(this, WelcomeActivity.class); }
0 0
- XPOSED源码研究之XposedInstaller(3)XposedInstallerActivity
- XPOSED源码研究之XposedInstaller(4)InstallerFragment
- XPOSED源码研究之XposedInstaller(5)ModulesFragment
- XPOSED源码研究之XposedInstaller(6)DownloadFragment
- XPOSED源码研究之XposedInstaller(7)SettingsFragment
- XPOSED源码研究之XposedInstaller(1)从manifest开始XposedApp
- XPOSED源码研究之XposedInstaller(2)从manifest开始WelcomeActivity
- XPOSED源码研究之简单介绍
- Xposed源码分析
- Xposed源码阅读小结
- Xposed源码剖析——Xposed初始化
- Xposed源码剖析——Xposed初始化
- Xposed源码剖析——Xposed初始化
- Xposed框架原理深入研究
- Xposed框架原理深入研究
- LIVE555源码研究之MediaServer(转)
- LIVE555源码研究之RTPServer(转)
- 研究Xposed相关一:Xposed框架的安装
- Redis介绍
- C#.NET WebApi返回各种类型(图片转二进制流或byte /json数据/字符串)
- [Elasticsearch] 聚合的测试数据 2
- LoaderManager使用详解(一)---没有Loader之前的世界
- JavaScript动态生成Form提交
- XPOSED源码研究之XposedInstaller(3)XposedInstallerActivity
- Highcharts选项配置详细说明文档
- JS----构造函数与原型prototype 区别
- ios学习笔记:storyboard页面跳转
- Axure7.0注册码(可用)
- [Elasticsearch] 聚合 - 时间数据处理(Looking at Time) 3
- TortoiseSVN使用简介
- php中mysqli用法举例
- java编程经验分享---怎样判断稽核类型的null