2010-07-07 49 views
26

所以我創建了一個名爲CustomTitlebarActivity的Activity子類。從本質上講,我的應用程序中的每個主要活動都會有一個自定義標題欄,其中包含許多常用功能,例如主頁按鈕,標題,搜索按鈕等。在我當前的實現中,我仍然在佈局XML中明確使用include語句每個CustomTitlebarActivity:Android以編程方式包含佈局(即沒有XML)

<include layout="@layout/titlebar" /> 

似乎天生就是我應該能夠內CustomTitlebarActivity做到這一點。我有兩個問題:哪些代碼可以替換這個包括標記,以及我應該在哪裏放置代碼? (我的第一個直覺是將它放在CustomTitlebarActivity的setContentView方法中。)

在相關說明中,我希望洞察更好的方式來重用android UI代碼(即使標題欄本身需要稍微改變。活動)

回答

14

就個人而言,我可能會寫我Activity子總是setContentView含垂直fill_parentLinearLayout佈局文件只包含我的標題欄: -

<LinearLayout android:id="@+id/custom_titlebar_container" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <!--titlebar here--> 
</LinearLayout> 

然後我會定義一個抽象getContentAreaLayoutId()見面請求CustomTitlebarActivity,它爲每個子類的標題欄下面的內容返回佈局ID;那麼CustomTitlebarActivity基礎onCreate()只需調用

setContentView(R.layout.custom_titlebar_activity_frame_from_above); 
View.inflate(this, getContentAreaLayoutId(), findViewById(R.id.custom_titlebar_container)); 

或者,你可以有你的抽象方法用於獲取內容區域返回View而非int,給你更多的靈活性,動態構造你的意見(但強迫你在簡單的中只需轉儲此XML佈局大小寫)。

+0

這個配置做了訣竅,我會更多地嘗試。關於如何在這類標題欄上添加各種動作按鈕的好主意? – 2010-07-07 15:25:20

+0

這取決於,但如果有相當數量的相當可預測的自定義(一個或兩個自定義按鈕/動作),我可能會堅持使用「由子類重寫的抽象方法來獲取要使用的圖像並採取行動」一個抽象的getFirstActionImageResourceId(),onFirstActionClicked()),並將它們掛在基類的onCreate()中。 – 2010-07-07 22:11:50

49

我也遇到過這個問題,我現在就解決了。我想我的解決辦法是簡單:

  1. 創建一個吹氣:

    LayoutInflater inflater = (LayoutInflater)  this.getSystemService(LAYOUT_INFLATER_SERVICE); 
    
  2. 膨脹子佈局:

    View childLayout = inflater.inflate(R.layout.child, 
          (ViewGroup) findViewById(R.id.child_id)); 
    
  3. 其添加到父:

    parentLayout.addView(childLayout); 
    

完成了,盡情享受吧!

+1

精確的答案爲 2013-04-29 06:34:31

+7

我認爲它應該是'findViewById(R.id.child_id));'not'R.layout.child_id' – Ranjit 2014-07-03 08:54:26

+0

當我這樣做時,寬度dont似乎停留在佈局中定義。不知道爲什麼 – 2017-08-09 16:04:25

相關問題