會使用搜索引擎的童鞋都知道搜一下怎麼實現
然後出來一大堆相同的結果,就是下面這一段代碼
[java]
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(view);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title);
他們給你什麼答案了麼?沒有,別用國內搜索引擎了,博客都TM是轉載的,那些SB博主們,趕緊滾粗
下面我就給你們論論這之中會有哪些坑:
1.
[java]
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
這句話必須放在setConentView之前,大家都知道,因此這句話就像在AndroidManifest.xml中進行配置一樣,設置了之後你就不能設置requestWindowFeature(Window.FEATURE_NO_TITLE),因為他們之間是互斥的。
2.
能夠自定義標題欄,但是怎麼更改自己放進去布局裡面的內容呢?
這個實際上很簡答, 只要findViewById(R.layout.title中的某個View的id)就能獲取到控件了,拿它來做相應的操作就行了
3.
你要動態隱藏和顯示標題欄怎麼辦呢?
你會搜到好多這樣的結果:
((ViewGroup)getWindow().
findViewById(com.android.internal.R.id.title_container)).setVisibility(View.GONE);
出於好心,我告訴你,這個方法是獲取不到這個layout的,因為,com.android.internal.R.id.title_container是受限的,所以你獲取到的是null
所以說,要獲取到正確的title_container的話,就只能用反射了,代碼如下
[java]
public static Object reflactFiled(String className, String filedName){
Object result = null;
try {
result = Class.forName(className).getField(filedName).get(null);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return result;
}
調用這個函數來獲取titleContainer的id吧,然後你就知道怎麼獲取到這個ViewGroup了
[java]
protected int getTitleContainerId(){
Object obj = Utils.reflactFiled("com.android.internal.R$id", "title_container");
if(obj != null){
return (Integer) obj;
}
else{
return -1;
}
}
4.
前面我只是說這個titleContainer是ViewGroup,但是,具體一點,它是一個FrameLayout
並且
[java]
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title);
是將R.layout.title這個布局inflate之後add到titleContainer中去的
因此,沒有特殊情況不要多次調用上面這個函數,不然就會出現titleContainer裡面出現兩個children的情況,但是你操縱的永遠是底層那個,使你得不到你想要的界面那效果了
通過上面4個坑的分析,若是你已經明白了我想表達的意思,我想你已經明白了如何在你的項目中使用title_container了