2011-09-14 24 views
7

我有一個在所有佈局中都有共同標題的應用程序。我希望當用戶點擊ID爲btn_home的ImageView時,應用程序將返回到特定的活動,例如我的「主」。Android中所有活動的常見可點擊標題

這樣做的最好方法是什麼?

我知道我可以爲每個活動定義onClick(View v),但也許有更好的方法來做到這一點。即使每一個活動都是一些(通過遺產),其他有onClick(View v)定義聽起來不好。

header.xml

<RelativeLayout ...> 
    <RelativeLayout android:id="@+id/relativeLayout1" ...> 
     <ImageView android:id="@+id/logo_cats"></ImageView> 
     <ImageView android:id="@+id/btn_home" ...></ImageView> 
    </RelativeLayout> 
</RelativeLayout> 

每佈局

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

回答

14

你可以在你的頭文件之外製作一個自定義組件,並在其中定義'onClick()'。例如,創建一個新的類Header,它將擴展一個RelativeLayout並在其中擴展header.xml。然後,代替<include>標籤,您可以使用<com.example.app.Header android:id="@+id/header" ...。沒有代碼重複和頭成爲完全可重用。

UPD:下面是一些代碼示例

header.xml:

<merge xmlns:android="http://schemas.android.com/apk/res/android"> 
    <ImageView android:id="@+id/logo" .../> 
    <TextView android:id="@+id/label" .../> 
    <Button android:id="@+id/login" .../> 
</merge> 

activity_with_header.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" ...> 
    <com.example.app.Header android:id="@+id/header" .../> 
    <!-- Other views --> 
</RelativeLayout> 

Header.java:

public class Header extends RelativeLayout { 
public static final String TAG = Header.class.getSimpleName(); 

protected ImageView logo; 
private TextView label; 
private Button loginButton; 

public Header(Context context) { 
    super(context); 
} 

public Header(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public Header(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public void initHeader() { 
     inflateHeader(); 
} 

private void inflateHeader() { 
    LayoutInflater inflater = (LayoutInflater) getContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    inflater.inflate(R.layout.header, this); 
    logo = (ImageView) findViewById(R.id.logo); 
    label = (TextView) findViewById(R.id.label); 
    loginButton = (Button) findViewById(R.id.login); 
} 

ActivityWithHeader.java :

public class ActivityWithHeader extends Activity { 
private View mCreate; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.activity_with_header); 

    Header header = (Header) findViewById(R.id.header); 
    header.initHeader(); 
    // and so on 
} 
} 

在這個例子中,Header.initHeader()可以報頭的構造內移動,但一般這種方法提供了一個很好的方式來傳遞一些有用的監聽器。希望這會有所幫助。

+0

聽起來不錯。但我該怎麼做? – rlc

+0

我已經添加了一個例子。 – Ash

+0

我根本看不到頁腳。我們可以在非活動類中調用「getSystemService()」方法嗎?我嘗試'getContext()',但它不顯示任何東西。 –

3

擴展Activity類和建立例如MyActivity類。在這個MyActivity類中,你可以包含onClick的代碼。

現在創建一個只包含頁眉的佈局。將該佈局包含在您的活動佈局中。

從MyActivity擴展所有活動 - 就是這樣。

如果您在ListActivities中需要相同的行爲,請創建MyListActivity。

+0

我不認爲這是做這件事的最好方法。這麼多代碼重複。 – rlc

+1

代碼重複?哪裏?您擴展活動一次,在那裏定義onClick一次,並在所有擴展您的MyActivity類的活動中自動使用它。一切都只寫一次,只有一次。這是Java方式,符合您的要求,非常適合。 –

+0

我有活動,MapActivities,ListActivities ... – rlc