[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
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)

留言

這個網誌中的熱門文章

[Android] layout_weight的妙用-讓View的大小以百分比率顯示(proportionate size)

[Android] 內部儲存體(Internal Storage)的檔案系統讀寫(File I/O)

【海外婚紗】造型篇-我的超人新祕Sunny-Yang