2012-10-21 35 views
9

我也需要相同的項目應用在每一個畫面[5個按鈕作爲標籤]創建一個通用的Android XML佈局。是否有可能創建一個具有這些5個按鈕「基地XML佈局」,然後讓所有其他的XML文件從某種方式淺佈局延伸,使得我不必有多個按鈕,這將最終具有相同的功能。如何爲所有活動

是否有這個問題更好的方法,可以通過API 9

回答

13

爲您的基本活動創建一個通用佈局。然後使用<include>標籤在所有佈局中包含該佈局,以便使其相同。

之後,創建一個抽象的活動,然後處理這個活動的按鈕和代碼的所有點擊,然後延伸中,你必須包括基地佈局的所有其他活動,本次活動。

例如

共同按鈕XML佈局

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/tabhost_bg" 
    android:gravity="center" 
    android:orientation="horizontal" 
    android:weightSum="3"> 

    <Button 
     android:id="@+id/btnHome" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/bottom_btn_active" 
     android:layout_weight="1" 
     android:text="@string/label_home" 
     style="@style/bottom_tab_btn"/> 

    <Button 
     android:id="@+id/btnSetting" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/bottom_btn_active" 
     android:layout_weight="1" 
     android:text="@string/label_settings" 
     style="@style/bottom_tab_btn"/> 

    <Button 
     android:id="@+id/btnMore" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/bottom_btn_active" 
     android:layout_weight="1" 
     android:text="@string/label_more" 
     style="@style/bottom_tab_btn"/> 

</LinearLayout> 

這裏是一個XML佈局,可以在其中包括上面的XML文件

<include 
     android:id="@+id/bottombar" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     layout="@layout/bottom_bar" /> 

這裏機器人:layout_width和機器人: layout_height和layout是強制屬性

現在,這裏是一個基本活動負責處理公共控件

public abstract class BottomBar extends Activity implements OnClickListener { 

    protected Button btnHome; 
    Button btnSetting, btnMore; 
    private Activity mActivity; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mActivity = this; 
    } 

    protected void mappingWidgets() { 

     btnHome = (Button) findViewById(R.id.btnHome); 
     btnSetting = (Button) findViewById(R.id.btnSetting); 
     btnMore = (Button) findViewById(R.id.btnMore); 

     btnHome.setOnClickListener(this); 
     btnSetting.setOnClickListener(this); 
     btnMore.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if (v == null) 
      throw new NullPointerException(
        "You are refering null object. " 
          + "Please check weather you had called super class method mappingWidgets() or not"); 
     if (v == btnHome) { 

     } else if (v == btnSetting) { 

     }else if(v == btnMore) { 

     } 
    } 

    protected void handleBackgrounds(View v) { 
     if (v == btnHome) { 
      btnHome.setBackgroundResource(R.drawable.bottom_btn_hover); 
      btnSetting.setBackgroundResource(R.drawable.bottom_btn_active); 
      btnMore.setBackgroundResource(R.drawable.bottom_btn_active); 

     } else if (v == btnSetting) { 
      btnHome.setBackgroundResource(R.drawable.bottom_btn_active); 
      btnSetting.setBackgroundResource(R.drawable.bottom_btn_hover); 
      btnMore.setBackgroundResource(R.drawable.bottom_btn_active); 

     } else if (v == btnMore) { 
      btnHome.setBackgroundResource(R.drawable.bottom_btn_active); 
      btnSetting.setBackgroundResource(R.drawable.bottom_btn_active); 
      btnMore.setBackgroundResource(R.drawable.bottom_btn_hover); 
     } 
    } 

} 

現在一個步驟是剩餘的點擊擴展了所有的活動於此基本活動。

您可以使用extends關鍵字擴展了活動的基本活動。 例如

public class MyActivity extends BottomBar 

注:從孩子的活動,你必須要調用基類的父類方法來處理你的基地佈局的共同控制的點擊。

您可以由此實現您的單一活動內的多個常見的佈局。

希望這會幫助你。 享受!

+0

有沒有一種方法可以訪問佈局中實現它的基礎佈局的ID? – zabawaba99

+0

我不認爲有必要訪問主機佈局中包含的佈局組件。如果你真的想訪問afaik,你可以使用它。 – Dharmendra

+0

真正有用的帖子!! :) – Nitesh

3

You may want to look in to the <include> tag.來支持它有效地採取您創建和您的其他佈局複製並粘貼它的XML。

所以你會做的是用你的按鈕創建一個佈局。將它們放置在<merge>標記之間,以便它們不會創建FrameLayout以便放置。然後使用<include>標記在其他佈局中使用相同的佈局。

注意:使用<include>標籤時,請務必覆蓋layout_widthlayout_height屬性。即使您在相同的值時重寫它們,情況也是如此。如果您還沒有覆蓋這些屬性,那麼以前版本的Android中會存在一個會忽略某些屬性的錯誤。

1

包括將要走的路,但我從來沒有得到這個可靠的工作我自己。也許我做錯了什麼,但編譯器並不總是在合併的佈局中選擇id。