2017-01-23 21 views
5

Tôi là người mới đối với Kotlin. Trong số những thứ rất thú vị khác, tôi đã tìm thấy các tiện ích mở rộng Android, according to the documentation, nên cho phép tôi sử dụng chế độ xem của hoạt động mà không cần findViewById.Thuộc tính tổng hợp của Kotlin xung đột

Trên thực tế nó hoạt động rất tốt bằng cách thêm chỉ dòng này nhập khẩu của tôi:

import kotlinx.android.synthetic.main.<layout>.* 

Vấn đề là khi hai bố trí khác nhau chứa một widget với cùng id (tức là cùng tên cho các tài sản tổng hợp),
ví dụ hai khác nhau TextView s với id txtTitle. Giả sử cái đầu tiên là một hoạt động và cái thứ hai thuộc về bố trí được sử dụng bên trong bộ điều hợp.

Khi tôi cố gắng gọi một phương thức trên TextView đầu tiên (hoạt động của nó), tôi không thể thấy kết quả mong đợi, như thể cuộc gọi sẽ được thực hiện trên một chế độ xem khác. Khi xác nhận điều này, khi tôi gọi số txtTitle.parent, tôi thấy phụ huynh và anh chị em của số khác txtTitle thay vì số tiền được mong đợi.

Tôi có làm gì sai không? Cách duy nhất mà tôi đã tìm thấy để bỏ qua vấn đề này là sử dụng tên gọi khác nhau trong tất cả các bố trí của tôi hoặc tiếp tục sử dụng findViewById, nhưng nó sẽ là một điều đáng tiếc để lãng phí năng ngôn ngữ này ...

+0

Tôi muốn khuyên bạn nên sử dụng tên phức tạp hơn cho ID của bạn :) Nó cũng ngăn không cho "chơi" với các lần nhập trong trường hợp của tôi. – UneXp

+0

Không chắc chắn nếu điều này trả lời câu hỏi của bạn, nhưng các cuộc gọi tổng hợp được dịch sang các cuộc gọi đến 'findviewById' và bởi vì mọi id ** tên ** được ánh xạ tới một giá trị duy nhất, nó không quan trọng * * nhập khẩu bạn sử dụng càng lâu khi bạn sử dụng tên với tên chính xác. –

+0

Tôi tưởng tượng, nhưng thực sự nó đang làm việc xấu. Tôi có một hoạt động với một txtTitle, bên trong của hoạt động này có một đoạn với RecyclerView: bên trong RecyclerView có các khung nhìn với một txtTitle.Tôi chỉ nhìn thấy những gì tôi đã viết: khi tôi sử dụng txtTitle bên trong của hoạt động nó không tạo ra kết quả mong đợi (nó không đặt văn bản của TextView); thay vào đó, nếu tôi sử dụng findViewById() từ hoạt động, nó hoạt động chính xác ... – Massimo

Trả lời

3

các kotlin documentation on imports nói

Nếu có một cuộc đụng độ tên, chúng ta có thể disambiguate bằng cách sử dụng từ khóa để as địa phương đổi tên đơn vị va chạm

Vì vậy, bạn có thể thử để nhập khẩu các bố trí với bí danh khác nhau:

import kotlinx.android.synthetic.main.<layoutActivity>.* as lActivity 
import kotlinx.android.synthetic.main.<layoutView>.* as lView 

Và sử dụng TextView với vòng loại tương ứng: lActivity.txtTitlelView.txtTitle

+0

Tôi không thể sử dụng từ khóa "as" trên câu lệnh nhập nhiều, IDE (Android Studio) cảnh báo tôi bằng thông báo "Không thể đổi tên tất cả các mục đã nhập thành một số nhận dạng". Hơn nữa, trong hoạt động của tôi tôi đã không nhập khẩu bố trí, bởi vì nó được sử dụng bởi một mảnh (gắn liền với hoạt động), không phải bởi hoạt động. – Massimo

0

Một giải pháp khả thi cho vấn đề của bạn là chỉ cần nhập một và bỏ qua các khác, giả sử tất cả các ID bạn cần có mặt trong một mà.

Vào cuối ngày, các ID tương tự trỏ đến cùng một điều và không quan trọng cho dù nó được nhập từ bố cục này hay bố cục khác.

Hy vọng rằng sẽ giúp

-1

Bạn có thể thử dưới điều cho TextView có cùng id từ cách bố trí khác nhau.

import kotlinx.android.synthetic.main.activity_main.text_hello as lActivity 

import kotlinx.android.synthetic.main.extra_layout.text_hello as lView 

sử dụng lActivity.text = "Some text" cho TextView từ activity_mainlView.text = "Some text" cho TextView từ extra_layout.

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