[Android] @android:id/與@+id/, @id/的差別(以TabActiviry說明)
在Android XML設計Layout時,id是元件要被程式動態控制的必須設定屬性,一般常見有下列三種id型式:
@+id/名稱
表示這是個全新的resource id,必須被加到R.java
@id/名稱
表示引用已存在的資源
@android:id
則表示引用Android framework所提供的資源
@android:id的用途
相信使用過ListView或TabView,一定對@android:id不陌生吧,要使用Tab View,Activity的content view一定要包含一個id屬性為@android:id/tabhost,否則就會產生下列Exception
@+id/名稱
表示這是個全新的resource id,必須被加到R.java
@id/名稱
表示引用已存在的資源
@android:id
則表示引用Android framework所提供的資源
@android:id的用途
相信使用過ListView或TabView,一定對@android:id不陌生吧,要使用Tab View,Activity的content view一定要包含一個id屬性為@android:id/tabhost,否則就會產生下列Exception
Your content must have a TabHost whose id attribute is 'android.R.id.tabhost'@android:id是framework所提供的一些內建的資源,像是ListView與Tab View,都是採用這類型的id,以TabActivity為例,如果你要呈現的Layout是預設的Tab View(僅顯示Tab View),那麼不用特別在onCreate時透過setContentView(xml)來指定Layout,系統會自動設定framework所預設的外觀,從TabActivity的source code就可以看出端倪,同樣道理ListView也是類似的機制:
private void ensureTabHost() { //沒有invoke setContentView() if(mTabHost==null){ this.setContentView(com.android.internal.R.layout.tab_content); } }
//有invoke setContentView //但沒有@android:id/tabhost的TabHost mTabHost=(TabHost)findViewById(com.android.internal.R.id.tabhost); if(mTabHost==null){ throw new RuntimeException( "Your content must have a TabHost whose id attribute is " "'android.R.id.tabhost'"); }總結來說,採用framework所提供id的View不需要特別指定Layout,除非功能呈現非預設的外觀,才需要額外定義layout XML(必須注意XML還是必須包含framework resource id)
留言
張貼留言