2011-12-16 36 views
11

Chúng ta hãy đi thẳng vào mã.findViewById trả về null trên <include> xem

Hoạt động Mã, phương pháp onCreate

setContentView(R.layout.main); 

View main_view = findViewById(R.id.main_view); 
View view_flipper = main_view.findViewById(R.id.vf); 
View first_tab = view_flipper.findViewById(R.id.prev_pane); 

Các main.xml mã bố trí:

<ViewFlipper android:id="@+id/vf" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 

    <include android:id="@+id/prev_pane" layout="@layout/vf_inner" /> 
<include android:id="@+id/cur_pane" layout="@layout/vf_inner" /> 
    <include android:id="@+id/next_pane" layout="@layout/vf_inner" /> 
</ViewFlipper> 

Vấn đề! Xem chính xác được tìm thấy, do đó, là ViewFlipper, nhưng prev_pane hoặc cur_pane hoặc next_pane không được tìm thấy, một con trỏ null được trả về. Bất kỳ ý tưởng tại sao?

Hoạt động này được gọi qua tab bằng cách sử dụng Mục đích. Tất cả các tài liệu tham khảo được giải quyết một cách chính xác, ngoại trừ của id trên bao gồm

Khi tôi kiểm tra các biến, tôi thấy nội dung của bố trí vf_inner trong mChildren

Trả lời

8

Đó là bởi vì <include /> thẻ không phải là một cái nhìn thực tế trong hệ thống phân cấp giao diện người dùng của bạn. Chúng có nhiều hướng dẫn dán & dán cho các công cụ Android.

Nếu bạn muốn tìm các ô khi chạy, hãy thêm ID vào phần tử gốc của bố cục được bao gồm. Bằng cách này, họ có thể được tìm thấy qua findViewById().

+0

Vâng, tất cả các ô đều giống nhau, nhưng chúng cần có nội dung khác nhau. Làm thế nào tôi có thể đạt được điều này? Thực tế là tất cả các chế độ xem được bao gồm chứa hình ảnh và chế độ xem văn bản có ID. Hình ảnh vẫn tĩnh nhưng văn bản khác với tất cả các ô. – Artis

+0

Ồ, tôi hiểu rồi. Tôi tin rằng XML bị hạn chế về vấn đề đó * (ít nhất tôi không có ý tưởng nào) *. Bạn có thể xây dựng này từ mã mặc dù. Thổi phồng ba trường hợp bố trí bằng cách sử dụng dịch vụ inflater layout, sử dụng 'setId()' trên các chế độ xem được tăng cường. Sau đó tìm kiếm ViewFlipper qua 'findViewById()' và thêm ba bố cục thông qua 'ViewFlipper.addView()'. –

+3

Lưu ý rằng bạn cũng có thể tham khảo các con của ViewFlipper qua ['ViewFlipper.getChildAt (index)'] (http://developer.android.com/reference/android/view/ViewGroup.html#getChildAt (int)) thay vì id của họ. Ví dụ. như: 'Xem first_tab = view_flipper.getChildAt (0)'. –

0

Một điều bạn có thể làm là bọc các câu lệnh <include> bên trong bố cục gốc (vẫn là con của bố cục chính chính). Cung cấp cho những người xem các id khác nhau để bạn có thể riêng lẻ findViewById.

+0

Chúng vẫn sẽ được coi là con của trình xem, vì vậy bạn sẽ không gặp vấn đề gì nếu bạn chỉ có một số lượt xem cố định trong đó. – josephus

+0

+1 Đúng, tôi đã bỏ lỡ khả năng này. Điều đó hoạt động nếu bạn * cần * id được giao cho trẻ em mặc dù. Nếu bạn không cần chúng, thay vì sử dụng 'ViewFlipper.getChildAt()' thay vào đó, như được mô tả trong phần bình luận của câu trả lời của tôi. Lý do cho điều này là bạn nên giữ cho khung cảnh hierachy càng phẳng càng tốt. Sâu hierachies xem lồng nhau có tác động hiệu suất cứng. –

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