Nhận chế độ xem gốc từ hoạt động hiện tại


634

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ừ onClicksự 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 ?


3
Trong hoạt động, thông thường bạn cho biết tài nguyên nào sẽ hiển thị bằng cách sử dụng 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.
xandy

Kế hoạch của tôi là đính kèm mã một cách linh hoạt .. vì vậy nếu người dùng của tôi sử dụng api, tôi hy vọng nó sẽ tự động phát hiện mọi thứ .. Giải pháp của Boulder hoạt động!
Lalith

4
@xandy: một lỗi đánh máy nhỏ: XAML -> XML.
siêu sao

Câu trả lời:


1048

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ế.


194
Trên thực tế, chỉ cần findViewById (android.R.id.content) là cho tôi chế độ xem gốc. Nếu điều đó không đúng trong một số trường hợp, tôi có thể lấy view gốc từ findViewById (android.R.id.content) .getRootView (). Cảm ơn câu trả lời. Tôi có thể tìm hiểu thêm về android.R ở đâu? Tôi đã không nhận thức được nó.
Lalith

4
Bạn có thể kiểm tra ở đây Tôi cho rằng developer.android.com/reference/android/R.html Đây chỉ là tài liệu tham khảo cho Android. Cá nhân tôi đã học về android.R.id.content sau đó kiểm tra bố cục trong hệ thống phân cấp.
Dmitry Ryadnenko

14
Tôi đã nhận thấy rằng chế độ xem này dường như bao gồm thanh trạng thái, vì vậy nếu bạn đang tìm kiếm phần hiển thị của hoạt động của mình, hãy sử dụng câu trả lời từ @piatedmeat.
Ben Clayton

5
@Lalith, bạn có thể giải thích chi tiết khi nào bạn cần làm findViewById (android.R.id.content) .getRootView () không? Một quy tắc chung sẽ thực sự hữu ích để biết.
batbrat

2
@batbrat Tôi cần sử dụng .getRootView () trong Android 5.0+ khi sử dụng thanh hành động
Morten Holmgaard

264

Đâ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);

33
Câu trả lời này đưa ra quan điểm mà không có thanh trạng thái - đó là những gì tôi muốn. Tôi đang tìm kiếm chiều rộng pixel + chiều cao của phần hiển thị của hoạt động. Cái này hoạt động, cảm ơn!
Ben Clayton

9
Điều này không bao gồm ActionBar!
Wayne

4
Có cách nào để bao gồm ActionBarlà tốt?
theblang

3
Các từ khóa ở đây là "chế độ xem gốc như được tìm thấy trong tệp XML". Cảm ơn bạn.
Kacy

3
Đây phải là câu trả lời được đánh dấu chính xác. Thao tác này sẽ đặt Snackbar bên trong Hoạt động của bạn (ở gốc), đây là nơi cần đến (Tôi khá chắc chắn không ai muốn đặt thông tin của mình phía sau Nút Nav)
Booger

136

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@#########

getWindow().getDecorView().findViewById(android.R.id.content)

cho con của nó

android.widget.FrameLayout@#######

Vui lòng xác nhận.


5
Android2.3.3 có vẻ giống nhau
ruX

2
Hoạt động trong 4.3 Là cách dễ nhất và ít mã nhất tôi đã tìm thấy.
Oliver Dixon

10
Tốt nhất nếu bạn đang sử dụng SnackBar
zackygaurav

getWindow (). getDecorView (). getRootView (). getHeight () trả về chiều cao hiển thị.
vovahost

3
getWindow (). getDecorView (). getRootView () không được khuyến nghị cho thanh ăn nhẹ, nó sẽ chồng lên thanh điều hướng hệ thống, findViewById (android.R.id.content) sẽ tốt hơn.
thanhbinh84

31

Nhận root xem từ hoạt động hiện tại.

Trong hoạt động của chúng tôi, chúng tôi có thể có được rootquan điểm với:

ViewGroup rootView = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

hoặc là

View rootView = getWindow().getDecorView().getRootView();

20

Trong Kotlin chúng ta có thể làm điều đó ngắn hơn một chút:

val rootView = window.decorView.rootView

19

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 đó


5
Bạn chỉ có thể gọi findViewById(R.id.imageView1);cho hoạt động nếu bạn muốn xem cụ thể.
RobCo


2

Giải pháp mở rộng Kotlin

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 rootViewtừ Hoạt động hoặc activity.rootViewbê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

1

để 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 ();


0

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


Không có phương pháp như vậy trong Activitylớp.
onelaview

window.decorView hoặc window.decorView dưới dạng Viewgroup - nếu bạn cần truyền nó tới Viewgroup
Edgar Khimich

0

Đố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

0

Một giải pháp mở rộng Kotlin

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_activitynhư là xem.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.