Tôi biết làm thế nào để có được chế độ xem gốc với View.getRootView () . Tôi cũng có thể có được chế độ xem từ onClick
sự kiện của nút trong đó đối số là Chế độ xem . Nhưng làm thế nào tôi có thể có được cái nhìn trong một hoạt động ?
Tôi biết làm thế nào để có được chế độ xem gốc với View.getRootView () . Tôi cũng có thể có được chế độ xem từ onClick
sự kiện của nút trong đó đối số là Chế độ xem . Nhưng làm thế nào tôi có thể có được cái nhìn trong một hoạt động ?
Câu trả lời:
Nếu bạn cần xem gốc của hoạt động của mình (để bạn có thể thêm nội dung của mình vào đó), hãy sử dụng
findViewById(android.R.id.content).getRootView()
Ngoài ra, nó đã được báo cáo rằng trên một số thiết bị bạn phải sử dụng
getWindow().getDecorView().findViewById(android.R.id.content)
thay thế.
Xin lưu ý rằng như Booger đã báo cáo, điều này có thể nằm sau thanh điều hướng (có nút quay lại, v.v.) trên một số thiết bị (nhưng dường như trên hầu hết các thiết bị thì không).
Nếu bạn cần có được chế độ xem mà bạn đã thêm vào hoạt động của mình bằng setContentView()
phương thức thì khi viết trong chậu, bạn có thể sử dụng
final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
.findViewById(android.R.id.content)).getChildAt(0);
Nhưng tốt hơn là chỉ đặt id cho chế độ xem này trong bố cục xml của bạn và sử dụng id này để thay thế.
Đây là những gì tôi sử dụng để có được chế độ xem gốc như được tìm thấy trong tệp XML được gán với setContentView
:
final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
.findViewById(android.R.id.content)).getChildAt(0);
ActionBar
là tốt?
Tôi đã thử nghiệm điều này trong Android 4.0.3, chỉ:
getWindow().getDecorView().getRootView()
đưa ra cùng một quan điểm những gì chúng ta nhận được từ
anyview.getRootView();
com.android.internal.policy.impl.PhoneWindow$DecorView@#########
và
getWindow().getDecorView().findViewById(android.R.id.content)
cho con của nó
android.widget.FrameLayout@#######
Vui lòng xác nhận.
Chỉ cần ai đó cần một cách dễ dàng hơn:
Các mã sau đây cho một cái nhìn của toàn bộ hoạt động:
View v1 = getWindow().getDecorView().getRootView();
Để có chế độ xem certian trong hoạt động, ví dụ: imageView bên trong hoạt động, chỉ cần thêm id của chế độ xem mà bạn muốn nhận:
View v1 = getWindow().getDecorView().getRootView().findViewById(R.id.imageView1);
Hy vọng điều này sẽ giúp ai đó
findViewById(R.id.imageView1);
cho hoạt động nếu bạn muốn xem cụ thể.
Sử dụng điều này để đơn giản hóa truy cập trong một Hoạt động. Sau đó, bạn có thể tham khảo trực tiếp rootView
từ Hoạt động hoặc activity.rootView
bên ngoài Hoạt động :
val Activity.rootView get() = window.decorView.rootView
Nếu bạn muốn thêm tương tự cho Fragment để thống nhất, hãy thêm:
val Fragment.rootView get() = view?.rootView
để có được Chế độ xem Hoạt động hiện tại
trong bất kỳ onClick nào, chúng tôi sẽ nhận được "Chế độ xem", bằng cách sử dụng 'chế độ xem' lấy rootView.
Xem view = view.getRootView ();
và để có được View trong đoạn
Xem view = FragmentClass.getView ();
nếu bạn đang ở trong một hoạt động, giả sử chỉ có một chế độ xem gốc, bạn có thể có được nó như thế này.
ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
.findViewById(android.R.id.content)).getChildAt(0);
sau đó bạn có thể chuyển nó đến lớp học thực sự của bạn
hoặc bạn có thể sử dụng
getWindow().getDecorView();
Lưu ý điều này sẽ bao gồm chế độ xem thanh hành động, chế độ xem của bạn ở dưới chế độ xem thanh hành động
Activity
lớp.
Đối với những người bạn đang sử dụng Thư viện liên kết dữ liệu , để lấy gốc của hoạt động hiện tại, chỉ cần sử dụng:
View rootView = dataBinding.getRoot();
Và đối với người dùng Kotlin, nó thậm chí còn đơn giản hơn:
val rootView = dataBinding.root
Nếu chế độ xem hoạt động của bạn được khai báo bằng xml (ví dụ activity_root.xml
), hãy mở xml và gán id cho chế độ xem gốc:
android:id="@+id/root_activity"
Bây giờ trong lớp của bạn, nhập chế độ xem bằng cách sử dụng:
import kotlinx.android.synthetic.main.activity_root.root_activity
Bây giờ bạn có thể sử dụng root_activity
như là xem.
setContentView()
và chế độ xem mà bạn cung cấp đã là gốc. Nếu bạn cần xử lý quan điểm đó, chỉ cần đặt ID cho nó trong XAML vàfindViewById()
sẽ ổn thôi.