細數android 自定義activity的title 中的坑(自定義title整個過程)

會使用搜索引擎的童鞋都知道搜一下怎麼實現
 
然後出來一大堆相同的結果,就是下面這一段代碼
 
[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了




原文鏈接:http://www.2cto.com/kf/201310/252754.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章