2011-09-14 15 views
7

Tôi có một ứng dụng có Tiêu đề chung trong tất cả các bố cục. Tôi muốn rằng bất cứ khi nào người dùng nhấp vào ImageView với id btn_home, ứng dụng sẽ quay trở lại hoạt động cụ thể, ví dụ "Chính của tôi".Tiêu đề có thể nhấp chung cho tất cả hoạt động trong Android

Cách tốt nhất để làm điều đó là gì?

Tôi biết rằng tôi có thể xác định onClick(View v) cho mọi hoạt động, nhưng có thể có cách tốt hơn để thực hiện điều đó. Thậm chí làm cho mọi hoạt động trở thành một số (thông qua di sản) khác có âm thanh được xác định là 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> 

mỗi layout

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

Trả lời

14

Bạn có thể tạo thành phần tùy chỉnh ra khỏi tiêu đề của mình và xác định 'onClick()' trong đó. Ví dụ: tạo một lớp mới Header để mở rộng RelativeLayout và tăng tệp header.xml của bạn ở đó. Sau đó, thay vì thẻ <include> bạn sẽ sử dụng <com.example.app.Header android:id="@+id/header" .... Không sao chép mã và tiêu đề trở nên hoàn toàn có thể tái sử dụng được.

UPD: Dưới đây là một số ví dụ mã

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 
} 
} 

Trong ví dụ này, Header.initHeader() có thể được di chuyển bên trong constructor Tiêu đề, nhưng nhìn chung phương pháp này cung cấp một cách tốt đẹp để vượt qua trên một số thính giả hữu ích. Hy vọng điều này sẽ giúp.

+0

Nghe hay đấy. Nhưng làm thế nào để tôi làm điều đó? – rlc

+0

Tôi đã thêm một ví dụ. – Ash

+0

tôi không thể thấy chân trang nào cả. chúng ta có thể gọi phương thức 'getSystemService()' của một hoạt động trong lớp không hoạt động không ?. tôi đã thử với 'getContext()' nhưng nó không hiển thị bất cứ thứ gì. –

3

Mở rộng lớp Hoạt động và xây dựng một lớp MyActivity ví dụ. Trong lớp MyActivity này, bạn có thể bao gồm mã cho onClick.

Bây giờ, hãy tạo bố cục chỉ giữ tiêu đề của bạn. Bao gồm bố cục đó trong bố cục hoạt động của bạn.

Mở rộng tất cả hoạt động của bạn từ MyActivity - chính là vậy.

Nếu bạn cần cùng một hành vi trong ListActivities cũng tạo một MyListActivity.

+0

Tôi không nghĩ đây là cách tốt nhất để làm điều đó. Quá nhiều sự lặp lại mã. – rlc

+1

Lặp lại mã? Ở đâu? Bạn mở rộng Hoạt động một lần, xác định onClick trong đó một lần và sử dụng nó tự động trong tất cả các Hoạt động mở rộng lớp MyActivity của bạn. Tất cả mọi thứ được viết một lần, chỉ một lần. Đây là cách Java và cho yêu cầu của bạn nó phù hợp hoàn hảo. –

+0

Tôi có các hoạt động, MapActivities, ListActivities ... – rlc

Các vấn đề liên quan