2010-11-08 40 views
20

Tôi đến với bạn trên đầu gối cong, câu hỏi trong tay. Tôi tương đối mới đối với Android, vì vậy hãy tha thứ cho bất kỳ điều gì mà tôi có thể nói.Nút nghe Onclick trong bố cục bao gồm

Giới thiệu: Tôi có một số bố cục trong ứng dụng, tất cả phải bao gồm chân trang chung. Chân trang này có một số nút cần thiết để quay lại trang chủ, đăng xuất, v.v.

Tôi đã quản lý chân trang này xuất hiện trong tất cả các trang cần thiết với sự trợ giúp của thẻ Bao gồm và Hợp nhất. Vấn đề nằm ở việc xác định các trình nghe nhấp chuột cho tất cả các nút. Mặc dù tôi có thể xác định người nghe trong mọi hoạt động liên quan đến màn hình bao gồm bố cục chân trang, tôi thấy rằng điều này trở nên tẻ nhạt khủng khiếp khi số lượng màn hình tăng lên.

Câu hỏi của tôi là thế này: Tôi có thể xác định một nút bấm nghe mà sẽ làm việc trên ứng dụng, mà có thể được truy cập từ bất kỳ màn hình với việc sử dụng các android: onClick thuộc tính của nút? Có nghĩa là, tôi muốn xác định trình nghe nhấp chuột một lần, trong một lớp riêng biệt, nói FooterClickListeners và chỉ cần đặt tên lớp đó làm lớp người nghe cho bất kỳ nhấp chuột nào vào chân trang. Ý tưởng là tạo một điểm truy cập duy nhất cho mã người nghe, để bất kỳ và tất cả thay đổi nào đối với người nghe nói sẽ phản ánh trong suốt ứng dụng.

Trả lời

16

Tôi gặp sự cố tương tự với trình đơn mà tôi đã sử dụng trong một số bố cục. Tôi đã giải quyết vấn đề bằng cách thổi phồng tệp xml bố cục trong lớp mở rộng RelativeLayout, sau đó tôi đã xác định onClickListener. Sau đó, tôi đưa vào lớp trong mỗi bố cục yêu cầu trình đơn. Mã này trông như thế này:

menu.xml

<?xml version="1.0" encoding="utf-8"?> 

<merge xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <ImageButton android:id="@+id/map_view" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:src="@drawable/button_menu_map_view" 
     android:background="@null" 
     android:scaleType="fitCenter" 
     android:layout_height="@dimen/icon_size" 
     android:layout_width="@dimen/icon_size"> 
    </ImageButton> 

    <ImageButton android:id="@+id/live_view" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:src="@drawable/button_menu_live_view" 
     android:background="@null" 
     android:scaleType="fitCenter" 
     android:layout_height="@dimen/icon_size" 
     android:layout_width="@dimen/icon_size"> 
    </ImageButton> 

    <ImageButton android:id="@+id/screenshot" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentRight="true" 
     android:src="@drawable/button_menu_screenshot" 
     android:background="@null" 
     android:scaleType="fitCenter" 
     android:layout_height="@dimen/icon_size" 
     android:layout_width="@dimen/icon_size"> 
    </ImageButton> 

</merge> 

MenuView.java

public class MenuView extends RelativeLayout { 

    private LayoutInflater inflater; 

    public MenuView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.menu, this, true); 

     ((ImageButton)this.findViewById(R.id.screenshot)).setOnClickListener(screenshotOnClickListener);   
     ((ImageButton)this.findViewById(R.id.live_view)).setOnClickListener(liveViewOnClickListener);  
     ((ImageButton)this.findViewById(R.id.map_view)).setOnClickListener(mapViewOnClickListener); 
    } 

    private OnClickListener screenshotOnClickListener = new OnClickListener() { 
     public void onClick(View v) { 
      getContext().startActivity(new Intent(getContext(), ScreenshotActivity.class)); 
     } 
    }; 

    private OnClickListener liveViewOnClickListener = new OnClickListener() { 
     public void onClick(View v) { 
      getContext().startActivity(new Intent(getContext(), LiveViewActivity.class)); 
     } 
    }; 

    private OnClickListener mapViewOnClickListener = new OnClickListener() { 
     public void onClick(View v) { 
      getContext().startActivity(new Intent(getContext(), MapViewActivity.class)); 
     } 
    }; 
} 

bố trí.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/main" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <SurfaceView android:id="@+id/surface" 
     android:layout_width="fill_parent" 
     android:layout_weight="1" 
     android:layout_height="fill_parent"> 

    </SurfaceView> 

    <!-- some more tags... --> 

    <com.example.inflating.MenuView 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" /> 

</RelativeLayout> 

với thẻ <com.example.inflating.MenuView />, bây giờ bạn có thể tái sử dụng Layout selfwritten của bạn (bao gồm cả OnClickListener) trong bố trí khác.

+0

Cảm ơn bạn billy tài năng :) Nó hoạt động! –

+0

Cảm ơn rất nhiều. Nó hoạt động cho tôi !!! – AD14

+1

Giải pháp tốt nhưng hơi dài. Nếu bạn đang tìm kiếm một số giải pháp đơn giản, hãy xem http://stackoverflow.com/a/16870468/1055241 – gprathour

0

Giải pháp như bạn mô tả là không thể, xin lỗi. Nhưng bạn có thể có hoạt động chung của cha mẹ cho tất cả các hoạt động của bạn sử dụng chân trang. Trong hoạt động này chỉ cung cấp các phương thức xử lý cho các nút chân trang của bạn, sau đó chỉ kế thừa từ nó mỗi khi bạn cần xử lý các thao tác chân trang.

+0

Cảm ơn bạn đã phản hồi nhanh. Vâng, tôi đã nghĩ về cùng một giải pháp mà bạn đề nghị, nhưng hy vọng sẽ tìm thấy những gì tôi mô tả. Tôi đoán tôi sẽ phải chọn giữa mã lặp lại và kế thừa. Cảm ơn một lần nữa! –

+0

Đây có phải là lý do khiến bạn không thể thực hiện điều này dưới dạng tabview không? – Falmarri

+0

Xin chào, Falmarri, tabview dường như gặp sự cố và treo ứng dụng, vì vậy tôi phải sử dụng biểu mẫu này. –

3

Đây là thứ được thêm vào roboguice trong tương lai gần. Nó sẽ cho phép bạn xây dựng các lớp điều khiển cho những thứ như thanh tiêu đề và chân trang và có các sự kiện autowired cho bạn.

Thanh toán http://code.google.com/r/adamtybor-roboguice/ cho mức tăng đột biến ban đầu.

Về cơ bản nếu bạn đang sử dụng roboguice, bạn có thể xác định thành phần cho chân trang và chỉ cần tiêm thành phần chân trang đó vào mỗi hoạt động. Không may là bạn vẫn phải thêm bộ điều khiển vào mọi hoạt động, giống như bạn đã làm với bố cục bao gồm, nhưng tin tốt là mọi thứ được kết nối cho bạn và tất cả logic của bạn vẫn ở trong một lớp duy nhất.

Dưới đây là một số mã giả của một số ví dụ về cách sử dụng.

public class FooterController { 
    @InjectView(R.id.footer_button) Button button; 

    @Inject Activity context; 

    @ContextObserver 
    public void onViewsInjected() { 
    button.setOnClickListener(new OnClickListener() { 
     void onClick() { 
     Toast.makeToast(context, "My button was clicked", Toast.DURATION_SHORT).show(); 
     } 
    }); 
    } 
} 

public class MyActivity1 extends RoboActivity { 
    @Inject FooterController footer; 
} 

public class MyActivity2 extends RoboActivity { 
    @Inject FooterController footer; 
} 
+0

trông thật ngọt ngào! cảm ơn! –

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