首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

PreferenceActivity 中的 onBuildHeaders() 调用机时

2013-02-28 
PreferenceActivity 中的 onBuildHeaders() 调用时机1. onBuildHeaders(ListPreferenceActivity.Header)

PreferenceActivity 中的 onBuildHeaders() 调用时机
1. onBuildHeaders(List<PreferenceActivity.Header>)在前一篇博文中(何时使用 Preference Headers)我们讲述了 Preference Headers 的作用和使用场景,onBuildHeaders 这个方法是在 PreferenceActivity 中用于创建和初始化 headers 的,创建 headers 之后我们可以在程序中引用 headers 实例,但需要注意其创建的时机,以免在创建之前就去引用从而导致出错。
2. 调用时机通过分析 PreferenceActivity 的源代码,可知 headers 的创建时机是在 onCreate() 的过程中被调用的,如下所示:

    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(com.android.internal.R.layout.preference_list_content);        mListFooter = (FrameLayout)findViewById(com.android.internal.R.id.list_footer);        mPrefsContainer = (ViewGroup) findViewById(com.android.internal.R.id.prefs_frame);        boolean hidingHeaders = onIsHidingHeaders();        mSinglePane = hidingHeaders || !onIsMultiPane();        String initialFragment = getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT);        Bundle initialArguments = getIntent().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);        int initialTitle = getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_TITLE, 0);        int initialShortTitle = getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_SHORT_TITLE, 0);        if (savedInstanceState != null) {            // We are restarting from a previous saved state; used that to            // initialize, instead of starting fresh.            ArrayList<Header> headers = savedInstanceState.getParcelableArrayList(HEADERS_TAG);            if (headers != null) {                mHeaders.addAll(headers);                int curHeader = savedInstanceState.getInt(CUR_HEADER_TAG,                        (int) HEADER_ID_UNDEFINED);                if (curHeader >= 0 && curHeader < mHeaders.size()) {                    setSelectedHeader(mHeaders.get(curHeader));                }            }        } else {            if (initialFragment != null && mSinglePane) {                // If we are just showing a fragment, we want to run in                // new fragment mode, but don't need to compute and show                // the headers.                switchToHeader(initialFragment, initialArguments);                if (initialTitle != 0) {                    CharSequence initialTitleStr = getText(initialTitle);                    CharSequence initialShortTitleStr = initialShortTitle != 0                            ? getText(initialShortTitle) : null;                    showBreadCrumbs(initialTitleStr, initialShortTitleStr);                }            } else {                // We need to try to build the headers.                onBuildHeaders(mHeaders);                // If there are headers, then at this point we need to show                // them and, depending on the screen, we may also show in-line                // the currently selected preference fragment.                if (mHeaders.size() > 0) {                    if (!mSinglePane) {                        if (initialFragment == null) {                            Header h = onGetInitialHeader();                            switchToHeader(h);                        } else {                            switchToHeader(initialFragment, initialArguments);                        }                    }                }            }        }/* 以下省略 */    }

我们在继承的 PreferenceActivity 中实现 onCreate() 的过程中必须认清楚,在调用 super.onCreate() 之后才能引用已经初始化的 headers,否则将出错。


热点排行