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 trueif (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; } });
也就是在XposedInstallerActivity的getActionBar().setSelectedNavigationItem(selectTabIndex)操作后会触发该回调,并显示Fragment,当然选择下来列表里的每一个项也会触发。这个Fragment是在Map列表里进行索引出来的,在setListNavigationCallbacks前有代码进行初始化:
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)); }
到此,逻辑就比较清晰了,选择不同的Item对应不同的类,分别为:
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); }
当点击的是ActionBar的Home图标区时返回到父页面,也就是WelcomeActivity。
0 0
原创粉丝点击