Mam TransactionTooLargeException
. Niereprodukowalny. W dokumentacji jest napisane
Transakcja Binder nie powiodła się, ponieważ była zbyt duża.
Podczas zdalnego wywołania procedury argumenty i wartość zwracana wywołania są przesyłane jako obiekty Parcel przechowywane w buforze transakcji Binder. Jeśli argumenty lub wartość zwracana są zbyt duże, aby zmieścić się w buforze transakcji, wywołanie zakończy się niepowodzeniem i zostanie zgłoszony wyjątek TransactionTooLargeException.
...
Istnieją dwa możliwe wyniki, gdy zdalne wywołanie procedury zgłosi wyjątek TransactionTooLargeException. Albo klient nie był w stanie wysłać swojego żądania do usługi (najprawdopodobniej, jeśli argumenty były zbyt duże, aby zmieściły się w buforze transakcji), lub usługa nie była w stanie odesłać swojej odpowiedzi z powrotem do klienta (najprawdopodobniej, jeśli wartość zwracana to zbyt duży, aby zmieścił się w buforze transakcji).
...
Więc gdzieś przekazuję lub odbieram argumenty przekraczające nieznany limit. Gdzie?
Stacktrace nie pokazuje nic użytecznego:
java.lang.RuntimeException: Adding window failed
at android.view.ViewRootImpl.setView(ViewRootImpl.java:548)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:406)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:320)
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:152)
at android.view.Window$LocalWindowManager.addView(Window.java:557)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2897)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$600(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:4977)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.os.TransactionTooLargeException
at android.os.BinderProxy.transact(Native Method)
at android.view.IWindowSession$Stub$Proxy.add(IWindowSession.java:569)
at android.view.ViewRootImpl.setView(ViewRootImpl.java:538)
... 16 more
android.os.TransactionTooLargeException
at android.os.BinderProxy.transact(Native Method)
at android.view.IWindowSession$Stub$Proxy.add(IWindowSession.java:569)
at android.view.ViewRootImpl.setView(ViewRootImpl.java:538)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:406)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:320)
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:152)
at android.view.Window$LocalWindowManager.addView(Window.java:557)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2897)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$600(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:4977)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Wydaje się, że jest to związane z widokami? Jak to się ma do zdalnego wywoływania procedur?
Może ważne: wersja Android: 4.0.3, urządzenie: HTC One X
Odpowiedzi:
Zetknąłem się z tym problemem i odkryłem, że kiedy ogromna ilość danych jest wymieniana między usługą a aplikacją (wiąże się to z przenoszeniem wielu miniatur). W rzeczywistości rozmiar danych wynosił około 500 kb, a rozmiar bufora transakcji IPC jest ustawiony na 1024 kB. Nie jestem pewien, dlaczego przekroczył bufor transakcji.
Może się to również zdarzyć, gdy przekazujesz dużo danych przez zamierzone dodatki
Po otrzymaniu tego wyjątku w aplikacji przeanalizuj kod.
Jak postępować, gdy pojawi się ten wyjątek
Jeśli to możliwe, podziel dużą operację na małe porcje, na przykład zamiast wywoływać komendę applyBatch () przy użyciu 1000 operacji, wywołuj ją po 100.
Nie wymieniaj dużych danych (> 1 MB) między usługami i aplikacjami
Nie wiem, jak to zrobić, ale nie pytaj Androida, który może zwrócić ogromne dane :-)
źródło
getInstalledApplications
. Co można zrobić, aby to rozwiązać?Jeśli chcesz sprawdzić, która paczka powoduje awarię, powinieneś rozważyć skorzystanie z TooLargeTool .
(Znalazłem to jako komentarz od @Max Spencer pod przyjętą odpowiedzią i było to pomocne w moim przypadku).
źródło
bundle.clear()
To nie jest ostateczna odpowiedź, ale może rzucić nieco światła na przyczyny a
TransactionTooLargeException
i pomóc w zlokalizowaniu problemu.Chociaż większość odpowiedzi odnosi się do dużej ilości przesyłanych danych, widzę ten wyjątek zgłoszony przypadkowo po intensywnym przewijaniu i powiększaniu oraz wielokrotnym otwieraniu menu pokrętła ActionBar. Awaria następuje po dotknięciu paska akcji. (jest to niestandardowa aplikacja do mapowania)
Wydaje się, że jedynymi przekazywanymi danymi są poprawki z „Input Dispatchera” do aplikacji. Myślę, że nie może to rozsądnie wynosić prawie 1 mb w „Buforze transakcji”.
Moja aplikacja działa na czterordzeniowym urządzeniu 1,6 GHz i wykorzystuje 3 wątki do podnoszenia ciężarów, dzięki czemu jeden rdzeń jest wolny dla wątku interfejsu użytkownika. Ponadto aplikacja korzysta z Androida: largeHeap, pozostało 10 mb nieużywanej sterty i pozostało 100 mb miejsca na wyhodowanie sterty. Więc nie powiedziałbym, że to problem z zasobami.
Awaria zawsze poprzedza następujące linie:
Które niekoniecznie są drukowane w tej kolejności, ale (o ile sprawdziłem) zdarzają się w tej samej milisekundie.
A sam ślad stosu, dla jasności, jest taki sam jak w pytaniu:
Wchodząc w kod źródłowy Androida, można znaleźć następujące linie:
frameworks / base / core / jni / android_util_Binder.cpp:
Dla mnie brzmi to tak, jakbym prawdopodobnie korzystał z tej nieudokumentowanej funkcji, w której transakcja kończy się niepowodzeniem z innych powodów niż Transakcja będąca zbyt duża. Powinni byli to nazwać
TransactionTooLargeOrAnotherReasonException
.W tej chwili nie rozwiązałem problemu, ale jeśli znajdę coś przydatnego, zaktualizuję tę odpowiedź.
aktualizacja: okazało się, że mój kod wyciekł z niektórych deskryptorów plików, których liczba jest zmaksymalizowana w systemie Linux (zwykle 1024), i wydaje się, że spowodowało to wyjątek. W końcu był to problem z zasobami. Sprawdziłem to, otwierając
/dev/zero
1024 razy, co spowodowało różnego rodzaju dziwne wyjątki w działaniach związanych z interfejsem użytkownika, w tym wyjątek powyżej, a nawet niektóre SIGSEGV. Najwyraźniej brak otwarcia pliku / gniazda nie jest czymś, co jest obsługiwane / zgłaszane bardzo czysto na Androidzie.źródło
TransactionTooLargeException
Został dręczące nas przez około 4 miesięcy, a my w końcu rozwiązany!To, co się działo, było to, że używamy
FragmentStatePagerAdapter
wViewPager
. Użytkownik przeglądał strony i tworzył ponad 100 fragmentów (jest to aplikacja do czytania).Chociaż odpowiednio zarządzamy fragmentami
destroyItem()
, w implementacji AndroidówFragmentStatePagerAdapter
występuje błąd, w którym zachowało się odniesienie do następującej listy:A kiedy Android
FragmentStatePagerAdapter
próbuje zapisać stan, wywoła tę funkcjęJak widać, nawet jeśli odpowiednio zarządzasz fragmentami w
FragmentStatePagerAdapter
podklasie, klasa podstawowa będzie nadal przechowywaćFragment.SavedState
dla każdego utworzonego fragmentu.TransactionTooLargeException
Nastąpiłoby po cenach dumpingowych, że tablica została DoparcelableArray
a system operacyjny nie chciałby nim 100+ szt.Dlatego poprawką dla nas było zastąpienie
saveState()
metody i nie przechowywanie niczego"states"
.źródło
@Override public Parcelable saveState() { Bundle bundle = (Bundle) super.saveState(); if (bundle != null) { Parcelable[] states = bundle.getParcelableArray("states"); // Subset only last 3 states if (states != null) states = Arrays.copyOfRange(states, states.length > 3 ? states.length - 3 : 0, states.length - 1); bundle.putParcelableArray("states", states); } else bundle = new Bundle(); return bundle; }
Dla tych, którzy gorzko rozczarowali szukaniem odpowiedzi na pytanie, dlaczego pojawia się TransactionTooLargeException, spróbuj sprawdzić, ile informacji zapisujesz w stanie instancji.
Na compile / targetSdkVersion <= 23 mamy tylko wewnętrzne ostrzeżenie o dużym rozmiarze zapisanego stanu, ale nic nie ulega awarii:
Ale na compile / targetSdkVersion> = 24 mamy prawdziwą awarię RuntimeException w tym przypadku:
Co robić?
Zapisz dane w lokalnej bazie danych i zachowaj tylko identyfikatory w stanie instancji, których możesz użyć do odzyskania tych danych.
źródło
Ten wyjątek jest zwykle zgłaszany, gdy aplikacja jest wysyłana w tle.
Zdecydowałem więc użyć metody Fragment danych, aby całkowicie ominąć
onSavedInstanceStae
cykl życia. Moje rozwiązanie obsługuje również złożone stany instancji i zwalnia pamięć jak najszybciej.Najpierw stworzyłem prosty Fargment do przechowywania danych:
Następnie w ramach mojej głównej aktywności całkowicie obchodzę zapisany cykl instancji i odraczam odpowiedzialność za fragment danych. Nie trzeba tego używać na samych fragmentach, ponieważ ich stan jest automatycznie dodawany do stanu działania):
Pozostało po prostu wyskoczyć z zapisanej instancji:
Pełne szczegóły: http://www.devsbedevin.net/avoiding-transactiontoolargeexception-on-android-nougat-and-up/
źródło
onSavedState()
, co zdarza się w wielu przypadkach. Zmiana konfiguracji jest jedna. Kolejne są przełączanie aplikacji i przechodzenie w tło. I jest ich więcej.Nie ma jednej konkretnej przyczyny tego problemu. Dla mnie w mojej klasie Fragmentów robiłem to:
zamiast tego:
źródło
Ważne jest, aby zrozumieć, że bufor transakcji jest ograniczony do 1 MB, niezależnie od możliwości urządzenia lub aplikacji. Bufor ten jest używany przy każdym wykonywanym wywołaniu interfejsu API i jest współużytkowany przez wszystkie transakcje aktualnie uruchomione przez aplikację.
Wierzę, że zawiera także pewne konkretne obiekty, takie jak paczki i tym podobne
(Parcel.obtain())
, dlatego ważne jest, aby zawsze dopasować każdyobtain()
z nichrecycle()
.Ten błąd może łatwo wystąpić w przypadku wywołań API zwracających dużo danych, nawet jeśli zwracane dane są mniejsze niż 1 MB (jeśli inne transakcje są nadal uruchomione).
Na przykład
PackageManager.getInstalledApplication()
połączenie zwraca listę wszystkich zainstalowanych aplikacji. Dodanie określonych flag pozwala odzyskać wiele dodatkowych danych. Może to się nie powieść, dlatego zaleca się, aby nie pobierać żadnych dodatkowych danych i nie pobierać ich dla poszczególnych aplikacji.Jednak połączenie może nadal nie powieść się, dlatego ważne jest, aby otoczyć je
catch
i w razie potrzeby móc spróbować ponownie.O ile mi wiadomo, nie można obejść tego problemu, oprócz ponownej próby i upewnienia się, że uzyskano jak najmniej informacji.
źródło
Ja też dostałem ten wyjątek na Samsung S3. Podejrzewam 2 główne przyczyny,
Użyj DDMS i spójrz na stertę podczas gry, co da ci pewne wskazówki, na którym setcontentview jest przyczyną problemu.
Skopiowałem wszystkie pliki rysunkowe we wszystkich folderach, aby pozbyć się problemu 2.
Problem został rozwiązany.
źródło
Dodaj to do swojej aktywności
Działa to dla mnie, mam nadzieję, że również ci pomoże
źródło
onCreate()
?Tak więc dla nas próbowaliśmy wysłać zbyt duży obiekt przez nasz interfejs AIDL do zdalnej usługi. Rozmiar transakcji nie może przekraczać 1 MB. Żądanie jest podzielone na osobne fragmenty o wielkości 512 KB i wysyłane pojedynczo przez interfejs. Brutalne rozwiązanie, które znam, ale hej - jego Android :(
źródło
Wyczyściłeś swoją starą InstanceState z metody onSaveInstanceState i będzie działać dobrze. Używam FragmentStatePagerAdapter dla mojego viewpager, więc trzymam poniżej metody Override w mojej działalności nadrzędnej dla jasnego InstanceState.
Znalazłem to rozwiązanie stąd android.os.TransactionTooLargeException na Nougat
źródło
Ostatnio spotkałem się również z ciekawym przypadkiem podczas pracy z dostawcą Kontaktów Androida .
Musiałem załadować zdjęcia kontaktów z wewnętrznej bazy danych kontaktów i zgodnie z architekturą systemu wszystkie te dane są dostarczane przez zapytania do dostawcy kontaktów.
Ponieważ działa jako osobna aplikacja - wszystkie rodzaje przesyłania danych są wykonywane przy użyciu mechanizmu Binder, dlatego też bufor Binder wchodzi w grę.
Moim głównym błędem było to, że ja nie blisko
Cursor
z danych BLOB otrzymali dostęp z kontaktów Provider, tak, że pamięć przydzielona dla dostawcy wzrosła i to nadmuchany spoiwa bufor aż dostałam mnóstwo!!!FAILED BINDER TRANSACTION!!!
wiadomości w moim wyjściu logcat.Więc główną ideą jest to, że kiedy pracujesz z zewnętrznymi dostawcami treści i dostajesz
Cursor
od nich s, zawsze zamykaj go, kiedy skończysz z nimi pracować.źródło
Ten sam problem napotkałem, gdy próbowałem wysłać bitmapę przez Intent, a jednocześnie, kiedy to się stało, złożyłem aplikację.
Jak to opisano w tym artykule, wprowadź tutaj opis linku , dzieje się tak, gdy działanie jest w trakcie zatrzymywania, co oznacza, że działanie próbowało wysłać swoje zapisane pakiety do systemu operacyjnego w celu bezpiecznego przechowywania w celu przywrócenia w późniejszym terminie (po zmianie konfiguracji lub proces śmierci), ale ten co najmniej jeden wysłany pakiet był zbyt duży.
Rozwiązałem go poprzez hack, zastępując onSaveInstanceState w mojej działalności:
i komentuj połączenie super. To brudny hack, ale działa idealnie. Bitmapa została pomyślnie wysłana bez awarii. Mam nadzieję, że to komuś pomoże.
źródło
W moim przypadku otrzymuję TransactionTooLargeException jako wtórną awarię po awarii biblioteki natywnej z SIGSEGV. Awaria natywnej biblioteki nie jest zgłaszana, więc otrzymuję tylko TransactionTooLargeException.
źródło
Mam to w moim syncadapter, gdy próbuję luzem Wstawić duże ContentValues []. Postanowiłem to naprawić w następujący sposób:
źródło
Dla mnie było to również
FragmentStatePagerAdapter
, jednak ominięciesaveState()
nie zadziałało. Oto jak to naprawiłem:Podczas wywoływania
FragmentStatePagerAdapter
konstruktora przechowuj osobną listę fragmentów w klasie i dodaj metodę usuwania fragmentów:Następnie w
Activity
, zapiszViewPager
pozycję i wywołaj metodęadapter.removeFragments()
przesłoniętąonSaveInstanceState()
:Wreszcie w
onResume()
metodzie przesłoniętej ponownie utwórz instancję adaptera, jeśli tak nie jestnull
. (Jeśli taknull
, toActivity
jest otwierany po raz pierwszy lub po tym, jak aplikacja została zabita przez system Android, w którymonCreate
nastąpi utworzenie adaptera).źródło
Upewnij się, że nie umieszczasz w danych obiektu obiektu o dużych rozmiarach. W moim przypadku dodałem rozmiar String 500k, a następnie rozpocząłem inną aktywność. Z tym wyjątkiem zawsze się nie udawało. Unikałem udostępniania danych między działaniami, używając zmiennych statycznych działań - nie musisz wysyłać ich do Intent, a następnie wyciągać z nich dane.
Co miałem:
źródło
Kiedy mam do czynienia z
WebView
aplikacją, tak się dzieje. Myślę, że jest to związane zaddView
zasobami interfejsu użytkownika. W mojej aplikacji dodaję trochę kodu wWebViewActivity
ten sposób poniżej, a następnie działa poprawnie:źródło
Znalazłem główną przyczynę tego (mamy „dodawanie okna nie powiodło się” i wyciek deskryptora pliku, jak mvds mówi).
Jest błąd w
BitmapFactory.decodeFileDescriptor()
Androida 4.4. Występuje on tylko kiedyinPurgeable
iinInputShareable
zBitmapOptions
są ustawionetrue
. Powoduje to wiele problemów w wielu miejscach interakcji z plikami.Zauważ, że metoda jest również wywoływana z
MediaStore.Images.Thumbnails.getThumbnail()
.Ten problem dotyczy Universal Image Loader . Wydaje się, że nie dotyczy to Picassa i Glide . https://github.com/nostra13/Android-Universal-Image-Loader/issues/1020
źródło
Ten jeden wiersz kodu w metodzie writeToParcel (Parcel dest, int flagi) pomógł mi pozbyć się TransactionTooLargeException.
Tylko po tym kodzie piszę wszystkie dane do obiektu działki, tj. Dest.writeInt () itp.
źródło
Spróbuj użyć
EventBus
lubContentProvider
polubić rozwiązanie.Jeśli jesteś w tym samym procesie (normalnie byłyby to wszystkie Twoje działania), spróbuj użyć
EventBus
, ponieważ w procesie wymiany danych NIE potrzebujesz nieco bufora, więc nie musisz się martwić, że twoje dane są zbyt duże. (Możesz po prostu użyć wywołania metody do przekazania danych, a EventBus ukrywa brzydkie rzeczy) Oto szczegół:Jeśli dwie strony Intencji nie są w tym samym procesie, spróbuj nieco
ContentProvider
.Zobacz TransactionTooLargeException
źródło
Wystąpił wyjątek TransactionTooLargeException z błędu Stackoverflow w teście Android Espresso. Znalazłem ślad stosu błędów przepełnienia stosu w dziennikach, gdy wyjąłem filtr Logcat dla mojej aplikacji.
Zgaduję, że Espresso spowodowało TransactionTooLargeException podczas próby obsługi naprawdę dużego śledzenia stosu wyjątków.
źródło
Można użyć:
w Manifeście Androida pod znacznikiem aplikacji.
To rozwiązało problem w moim przypadku!
źródło
onSaveInstantState
działań / fragmentów i zapisywania dużych list) nie pomogło.Miałem również do czynienia z tym problemem związanym z przekazywaniem danych bitmapowych z jednej aktywności do drugiej, ale rozwiązuję to, tworząc moje dane jako dane statyczne, co działa idealnie dla mnie
W pierwszej kolejności:
i w drugiej aktywności:
źródło
Działo się tak w mojej aplikacji, ponieważ przekazywałem listę wyników wyszukiwania w argumentach fragmentu, przypisując tę listę do właściwości fragmentu - która w rzeczywistości jest odniesieniem do tej samej lokalizacji w pamięci wskazywanej przez argumenty fragmentu - a następnie dodałem nowe pozycje na liście, które również zmieniły rozmiar argumentów fragmentu. Gdy działanie jest zawieszone, podstawowa klasa fragmentu próbuje zapisać argumenty fragmentu w onSaveInstanceState, który ulega awarii, jeśli argumenty są większe niż 1 MB. Na przykład:
Najłatwiejszym rozwiązaniem w tym przypadku było przypisanie kopii listy do właściwości fragmentu zamiast przypisania odwołania:
Jeszcze lepszym rozwiązaniem byłoby nie przekazywanie tak wielu danych w argumentach.
Prawdopodobnie nigdy nie znalazłbym tego bez pomocy tej odpowiedzi i TooLargeTool .
źródło
Przeżyłem również TransactionTooLargeException. Po pierwsze, pracowałem nad zrozumieniem, gdzie to się dzieje. Wiem, dlaczego tak się dzieje. Każdy z nas wie z powodu dużej zawartości. Mój problem taki był i rozwiązałem. Może to rozwiązanie może być przydatne dla każdego. Mam aplikację, która pobiera zawartość z interfejsu API. Otrzymuję wynik z interfejsu API na pierwszym ekranie i przesyłam go na drugi ekran. Mogę pomyślnie wysłać tę zawartość na drugi ekran. Po drugim ekranie, jeśli chcę przejść na trzeci ekran, występuje ten wyjątek. Każdy mój ekran jest tworzony z Fragmentu. Zauważyłem to, kiedy wychodzę z drugiego ekranu. Zapisuje zawartość pakietu. jeśli ta zawartość jest zbyt duża, zdarza się ten wyjątek. Moje rozwiązanie jest po usunięciu zawartości z pakietu.
źródło
Rozwiązaniem byłoby zapisanie przez aplikację ArrayList (lub dowolnego obiektu powodującego problem) w systemie plików, a następnie przekazanie odwołania do tego pliku (np. Nazwa pliku / ścieżka) za pośrednictwem usługi Intent do usługi IntentService, a następnie pozostawienie usługi IntentService pobierz zawartość pliku i przekonwertuj go z powrotem na ArrayList.
Gdy usługa IntentService zrobi to z plikiem, powinna go usunąć lub przekazać instrukcję z powrotem do aplikacji za pośrednictwem transmisji lokalnej, aby usunąć utworzony plik (przekazując to samo odwołanie do pliku, które zostało do niego dostarczone).
Aby uzyskać więcej informacji, zobacz moją odpowiedź na ten związany problem .
źródło
Ponieważ intencje, dostawcy treści, komunikator, wszystkie usługi systemowe, takie jak telefon, wibrator itp., Wykorzystują dostawcę infrastruktury IPC firmy Binder. Co więcej, wywołania zwrotne cyklu życia aktywności również korzystają z tej infrastruktury.
1 MB to ogólny limit wszystkich transakcji segregatorów przeprowadzonych w systemie w danym momencie.
W przypadku gdy wiele transakcji dzieje się w momencie wysłania zamiaru, może się to nie udać, nawet jeśli dodatkowe dane nie są duże. http://codetheory.in/an-overview-of-android-binder-framework/
źródło
Przy tak wielu miejscach, gdzie TransactionTooLargeException może happen-- oto jeszcze jeden nowy na Androida 8 - trzask, gdy ktoś po prostu zaczyna wpisywać się w EditText jeśli zawartość jest zbyt duży.
Jest to związane z AutoFillManager (nowość w API 26) i następującym kodem w
StartSessionLocked()
:Jeśli dobrze rozumiem, wywołuje to usługę autouzupełniania - przekazując AutofillManagerClient w segregatorze. A kiedy EditText ma dużo treści, wydaje się, że powoduje TTLE.
Kilka rzeczy może to złagodzić (lub zrobiłem tak, jak i tak testowałem): Dodaj
android:importantForAutofill="noExcludeDescendants"
w deklaracji układu xml EditText. Lub w kodzie:Drugim okropnym, okropnym obejściem może być również zastąpienie metod
performClick()
i wonWindowFocusChanged()
celu wychwycenia błędu w samej podklasie TextEdit. Ale nie sądzę, żeby to było naprawdę mądre ...źródło