位置: 編程技術(shù) - 正文
推薦整理分享關(guān)于使用RequestWindowFeature為啥一定要在setContentView之前調(diào)用,希望有所幫助,僅作參考,歡迎閱讀內(nèi)容。
文章相關(guān)熱門搜索詞:,內(nèi)容如對您有幫助,希望把文章鏈接給更多的朋友!
網(wǎng)上關(guān)于RequestWindowFeature()的用法有很多,卻難找一篇解釋清楚的文章供大家了解,下面這是我遇到這個問題并且得出的一點結(jié)論供大家參考。
Activity的RequestWindowFeature()實際上走的是PhoneWIndow的requestFeature(),在PhoneWIndow的requestFeature()中有個前提條件,成員屬性mContentParent不能為非null,這是構(gòu)建窗體的view,即在為窗體設(shè)置屬性時,還不能構(gòu)建窗體。如下:
@Override public boolean requestFeature(int featureId) { if (mContentParent != null) { throw new AndroidRuntimeException("requestFeature() must be called before adding content"); }
.....
return super.requestFeature(featureId); }
但是在activity中使用setContentView()時,實際上走的是phonewindow的setContentView,根據(jù)代碼我們看到
@Override
public void setContentView(View view, ViewGroup.LayoutParams params) { if (mContentParent == null) { installDecor(); } else { mContentParent.removeAllViews(); } mContentParent.addView(view, params); final Callback cb = getCallback(); if (cb != null && !isDestroyed()) { cb.onContentChanged(); }}
它會首先判斷mContentParent 是否為null,如果為null,進入installDecor();
private void installDecor() {
......
if (mContentParent == null) { mContentParent = generateLayout(mDecor); mTitleView = (TextView)findViewById(com.android.internal.R.id.title); if (mTitleView != null) { if ((getLocalFeatures() & (1 << FEATURE_NO_TITLE)) != 0) { View titleContainer = findViewById(com.android.internal.R.id.title_container); if (titleContainer != null) { titleContainer.setVisibility(View.GONE); } else { mTitleView.setVisibility(View.GONE); } if (mContentParent instanceof FrameLayout) { ((FrameLayout)mContentParent).setForeground(null); } } else { mTitleView.setText(mTitle); } }
.....
}
這是installDecor方法的部分代碼,從中我們可以看到,它會對mContentParent 進行初始化,從而賦予相應(yīng)的,這就是RequestWindowFeature為啥一定要在setContentView之前調(diào)用就會拋此類異常
Caused by: android.util.AndroidRuntimeException: requestFeature() must be called before adding content- ::.: E/AndroidRuntime(): at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:)- ::.: E/AndroidRuntime(): at android.app.Activity.requestWindowFeature(Activity.java:)- ::.: E/AndroidRuntime(): at com.solar.BaseActivity.onCreate(BaseActivity.java:)- ::.: E/AndroidRuntime(): at com.solar.SetupInfoActivity.onCreate(SetupInfoActivity.java:)- ::.: E/AndroidRuntime(): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:)- ::.: E/AndroidRuntime(): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:)d
Android 性能測試實踐(二) 實時監(jiān)控工具 轉(zhuǎn)載地址:
Android開發(fā)之時間刻度盤 一、最近的一個項目中有遇到時間刻度盤的需求,在網(wǎng)上沒找到合適的,于是自己就花點時間實現(xiàn)了,現(xiàn)在分享出來,效果如下圖:在介紹如何實現(xiàn)之
Android面試題 1.Android序列化,其中的差異。Android自定義對象可序列化有兩個選擇一個是Serializable和Parcelable;差異:1、在使用內(nèi)存的時候,Parcelable比Serializable性能高
標(biāo)簽: 關(guān)于使用RequestWindowFeature為啥一定要在setContentView之前調(diào)用
本文鏈接地址:http://esstyw.cn/biancheng/382298.html 轉(zhuǎn)載請保留說明!網(wǎng)站地圖: 企業(yè)信息 工商信息 財稅知識 網(wǎng)絡(luò)常識 編程技術(shù)
友情鏈接: 武漢網(wǎng)站建設(shè)