android View với View.GONE vẫn nhận được onTouch và onClick


76

Điều này làm tôi bối rối:

Theo như tôi đã đọc, một chế độ xem với setVisibility (View.GONE); sẽ không nhận được bất kỳ sự kiện chạm hoặc nhấp chuột nào nữa. Bố cục của tôi có hai phần, sẽ hiển thị hoặc biến mất để chỉ một trong số chúng hiển thị và có thể sử dụng tại một thời điểm nhưng View.GONE không thực hiện thủ thuật này. Tôi không thể thấy chế độ xem GONE, như mong đợi, nhưng nó vẫn phản ứng với onClick (và sử dụng sự kiện mà chế độ xem khác sẽ nhận được).

Bạn có thể giúp tôi được không?

Có thể quan tâm: Khi tôi bắt đầu dự án của mình, một chế độ xem là GONE, chế độ xem kia hiển thị. Lần này nó sẽ hoạt động như mong đợi (chế độ xem GONE về cơ bản bị bỏ qua), nhưng sau khi đặt View.GONE thông qua mã, nó sẽ ngừng hoạt động.


1
Điều này có xảy ra ngay sau khi gọi View.GONE không? Chỉ trong một khoảng thời gian giới hạn? Nó có thể liên quan đến thực tế là các thay đổi giao diện người dùng không ảnh hưởng ngay lập tức.
Cheryl Simon

1
Chúng tôi cần thêm một số thông tin. Hãy thử sử dụng hierarchyviewercông cụ để kiểm tra trạng thái của hệ thống phân cấp chế độ xem của bạn trong thời gian chạy. Điều này sẽ cho phép bạn thấy trạng thái hiển thị và hơn thế nữa khi gỡ lỗi các vấn đề về chế độ xem.
adamp

Cảm ơn bạn. Điều này xảy ra ngay sau khi gọi View.GONE. Công cụ xem phân cấp cho biết rằng chế độ xem là GONE nhưng nó vẫn nhận được onClick. Plattform của tôi là CyanogenMod 2.2 (nhưng tôi hy vọng điều này vẫn còn là một vấn đề trong mã của tôi: D)
ShadowMare

Tôi có cùng một vấn đề mà không có hình ảnh động. Ngay cả khi đặt mọi phần tử trong ViewGroup thành GONE, tôi vẫn có thể chọn nội dung của GONE EditText và tải Bàn phím.
philipp.

Sau View.GONE, phần tử của bố cục nhận sự kiện onClick (). Điều này có Chế độ xem hoạt ảnh và Đi qua. Làm thế nào để chặn điều này?
iBrain

Câu trả lời:


112

Bạn có thể sử dụng hình ảnh động để hiển thị / ẩn các chế độ xem không? Tôi gặp hiện tượng này khi sử dụng hoạt ảnh có android: fillEnabled = "true" android: fillAfter = "true" Tôi không hiểu điều đó và có vẻ như lỗi - nếu tôi sử dụng hoạt ảnh không có fillEnabled / fillAfter, tất cả đều hoạt động như mong đợi. ..


2
Có bất kỳ công việc xung quanh có sẵn không? Tôi đang sử dụng nineoldandroids và thấy hành vi này trên API10 - Tôi nghĩ nó sử dụng fillEnabled để mô phỏng hành vi API 3.0 sửa đổi thuộc tính chế độ xem sau hoạt ảnh.
Rafael Nobre

1
Tôi cũng đang gặp sự cố này với các API Android Google 4.4.2.
GuilhE

Cảm ơn, đúng là điều này đã giúp tôi :)
Android Noob

Cảm ơn bạn đã gợi ý, loại bỏ android: fillAfter = "true", đính kèm trình nghe hoạt ảnh với code @Override public void onAnimationEnd(Animation animation) { /* Android will make an exception when you change the view hierarchy * in animationEnd. http://stackoverflow.com/a/7445557/587186 */ new Handler().post(new Runnable() { public void run() { if (interventionPreview != null) { interventionPreview.setVisibility(View.GONE); } } }); } đã làm điều đó, hy vọng nó sẽ hữu ích.
cáo

Cảm ơn vì đã cứu tôi khỏi bị nhức đầu nhẹ
Koen Van Looveren

108

Nếu bạn đặt setVisibility(View.GONE)sau một số hoạt ảnh (chẳng hạn như mờ dần), thì hãy thử xóa hoạt ảnh bằng clearAnimation(). Đây là những gì đã giúp tôi.


3
Đây là một câu trả lời tốt hơn. Có những tình huống mà bạn muốn sử dụng android:fillAfterandroid:fillEnabledtrong hoạt ảnh của mình và bạn muốn chế độ xem ngừng phản hồi.
Mick Byrne

1
Cái này phù hợp với tôi, nhưng vì hoạt ảnh của tôi sẽ kéo dài trong một hoặc hai giây sau đó clearAnimation()dừng hoạt ảnh và tôi không thể thấy mờ dần trong hoạt ảnh mờ dần. Thay vì cái đó, tôi đã sử dụng alpha.setFillAfter(false);trong hoạt ảnh alpha của mình và nó hoạt động chính xác như tôi mong đợi.
osayilgan

9
Đây là aswer tốt nhất, cảm ơn bạn! @osayilgan, trong trường hợp này bạn chỉ cần đặt trình nghe onEndAnimation và clearAnimation () ở đó, sau khi hoạt ảnh kết thúc.
Rafael Nobre

Tôi tin rằng câu trả lời này tốt hơn câu trả lời được chấp nhận, vì hành vi fillAfter có thể được mong muốn. Cảm ơn bạn, bạn đã cứu tôi một thế giới đầy tổn thương.
ssawchenko

2
@osayilgan bạn nên đặt clearAnimation()cuộc gọi vào onAnimationEnd()phương thức. Sau đó, nó hoạt động như mong đợi.
Saran

8

Thử đặt thuộc tính clickable thành false bằng setClickable (false) sau setVisibility (View.GONE)


5

Có, mview.clearAnimation()có một số điều khoản nhưng amination.setFillAfter(false);mview.setClickable(false);CÔNG VIỆC hoàn hảo.


2

Điều tôi mong đợi đang xảy ra là bạn làm cho một chế độ xem trở nên vô hình, nhưng những chế độ xem đó mà trẻ em vẫn phản hồi với các nhấp chuột (tức là chế độ xem của bạn là một ViewGroup). Bạn có thể làm điều gì đó dọc theo các dòng:

private void hideTheChildren(View v){
    if(v instanceof ViewGroup) {
        int count = ((ViewGroup)v).getChildCount();
        for(int k = 0 ; k < count ; k++) {
            hideTheChildren(((ViewGroup)v).getChildAt(k));
        }
        v.setVisibility(View.GONE);
    }
    else {
        v.setClickable(false);
        v.setVisibility(View.GONE);
    }
}

tất nhiên sau đó bạn cũng phải làm ngược lại

private void showTheChildren(View v){
    if(v instanceof ViewGroup) {
        int count = ((ViewGroup)v).getChildCount();
        for(int k = 0 ; k < count ; k++) {
            showTheChildren(((ViewGroup)v).getChildAt(k));
        }
        v.setVisibility(View.VISIBLE);
    }
    else {
        v.setClickable(true);
        v.setVisibility(View.VISIBLE);
    }
}

Điều này đã làm việc cho tôi trong quá khứ. Tôi hiện không biết cách tốt hơn để làm điều này.


1
Sau 8 năm, đây vẫn là một vấn đề. Điều này sẽ hiệu quả miễn là bạn không có một góc nhìn khác phía sau.
Tamoxin

1

Tôi đã đăng cái này dưới dạng một bình luận, nhưng tiếc là tôi không thể đăng một bình luận. Vì nó có thể là một giải pháp khả thi cho bạn, tôi đăng nó theo cách đó:

Khi bạn viết "onClick", tôi giả sử bạn đang sử dụng onClickthuộc tính trong bố cục XML của mình. Cố gắng đặt OnClickListenervới setOnClickListenerthay vì onClickthuộc tính. Có lẽ điều này sẽ giúp ...


Cảm ơn bạn đã trả lời của bạn. Tôi đã sử dụng setOnClickListener thay vì thẻ xml.
ShadowMare

1

Đối với những người đã thực hiện các câu trả lời ở trên mà vẫn không giải quyết được vấn đề của họ, tôi khuyên bạn nên xóa chế độ xem khỏi chế độ xem chính. Nếu bạn cần hiển thị lại dạng xem, chỉ cần tạo một bản sao và thêm nó vào dạng xem chính.

Điều này có vẻ quá mức cần thiết nhưng tôi đang ẩn / hiển thị toàn bộ nhóm chế độ xem trong trường hợp của bạn, nó có thể là một nút, chế độ xem văn bản hoặc hình ảnh, giải pháp này sẽ vẫn hoạt động.


2
Đây thực sự là điều duy nhất làm việc cho tôi. LƯU Ý: Tôi đang sử dụng một chế độ xem để che một chế độ xem khác BottomSheetBehaviortrong khi tải dữ liệu. Với tất cả các câu trả lời khác, chế độ xem tiếp tục chặn các thao tác chạm / cử chỉ. Và điều này đã phá vỡ BottomSheetBehaviour| Android 8.0 với design-support-lib 27.0.2
Entreco


0

nếu có hoạt ảnh ở dạng xem, bạn nên gọi view.clearAnimation.

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.