Pytanie Zwykły textarea w Android WebKit nie narysuje obrazu tła


Android WebKit rysuje białe tło i obramowanie na obszarach tekstowych i wejściach, gdy mają fokus. Jak mogę to powstrzymać?

no background image on focused textarea

Próbowałem zmienić -webkit-tap-highlight-color, -webkit-appearance, -webkit-backface-visibility, outline i garść innych rzeczy, nic nie działa. Wsparcie!


11
2018-05-16 17:48


pochodzenie




Odpowiedzi:


EDYTOWAĆ

Ok, więc zapomnij o wszystkim, na co wcześniej odpowiedziałem. Przeprowadziłem kilka testów i wydaje się, że jest to problem tylko w systemie Android 4.0.3. I są złe wieści.

Zacząłem kopać w źródło i uważam, że problem leży w tym WebTextView klasa. Klasa obsługująca widoki tekstowe i tekstowe.

Jeśli widzisz na liniach 233-240, metoda rysująca tło zawsze rysuje niebieski prostokąt i biały prostokąt wewnątrz. Dokładnie to pokazuje zrzut ekranu.

Dobrym rozwiązaniem byłoby rozszerzenie tej klasy i naprawienie jej. Niestety nie ma klasy WebTextView w sdk. Oznacza to, że nie możesz tego zmienić.

Próbowałem wszystkich rodzajów javascriptu, aby zmienić kolor tekstu, nawet nakładanie się na element ale to nie pomaga. To nie jest coś, do czego możemy dotrzeć z poziomu kodu HTML.

Nie można go naprawić w Javie i nie można go naprawić w javascript. Obawiam się, że nie ma rozwiązania tego problemu.

EDYTOWAĆ 

Poprawiono mnie. Dzięki @grandstaish dla sugestii skupienia, możemy łatwo zmienić kolor tła po TextView jest tworzone. Próbowałem użyć ViewTreeObserver dla eleganckiego rozwiązania, ale nie mogłem kierować tylko na widoki, które chciałem. Każdy obiekt TextView miałby przezroczyste tło i nie chciałem tego. Tak więc podejście hybrydowe rozwiązało to:

HTML:

 <div style="background:red; position:relative; width:100%; height:500px; z-index:0;" id='behind' >
    <textarea name="Name"style="background:green; border:none; height:100px; width:250px; position:absolute; top:0; left:0; z-index:1;" 
            id='area1' onFocus='runOnFocus()' ></textarea>
    </div>

JS:

function runOnFocus(){
if (window.device.platform == "Android" && window.device.version =="4.0.3")
//I had to set a timeout here or this would trigger before the TextView was created. 1ms seems to be enough though.
window.setTimeout(function(){
        window.AndroidLayer.setBackground();},1);        
}

Jawa:

private String TAG = "TextArea";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.loadUrl("file:///android_asset/index.html");
        appView.addJavascriptInterface(this, "AndroidLayer");                       
    }

public void setBackground(){
    runOnUiThread( new Runnable() {         
        @Override
        public void run() {
            Log.d("native","gotFocus");
            View tv = (View) appView.getFocusedChild();     
            if (tv == null)
                Log.d("native","isNull");
            else
                tv.setBackgroundColor(Color.TRANSPARENT);               
        }
    });

}

Możemy więc kontrolować, które elementy na stronie wywołają zmianę tła. Nie mogłem znaleźć żadnych niepożądanych efektów ubocznych, ale nie miałem czasu przetestować go we wszystkich wersjach, więc zdecydowałem się ograniczyć go do wersji 4.0.3, jedynej wersji, jaką mogłem znaleźć w tym wydaniu.


8
2018-05-22 13:21



Widziałem tę pracę w niektórych wersjach Androida (nie wiem, którą wersję, ten tablet został zmiażdżony). Na moim obecnym tablecie z 4.0.x to nie działa ... Jaką wersję Androida uruchamiasz? - Clayton Rabenda
To tylko kwestia 4.0.3. I o ile mogę powiedzieć, nie ma rozwiązania. - caiocpricci2
W końcu mam czas wrócić do tego. Właśnie przeskoczyłem OnHierarchyChangeListener weebview i ustawić każdy widok na przezroczysty w onChildViewAdded. Tak jak powiedziałeś, nie mogę wybrać, które z nich będą miały to, ale działa to dla mojej konkretnej aplikacji. Dziękuję bardzo za poświęcenie czasu, aby mi pomóc! : D: D - Clayton Rabenda
Cieszę się, że pomogło! Tbh Naprawdę się cieszę, że pytasz lub nigdy nie dowiem się o tym błędzie. Udało mi się to naprawić w opublikowanych aplikacjach, które mamy! Dobrze zauważony! - caiocpricci2


Android umieszcza natywny widok tekstowy na górze pola tekstowego, gdy jest on skupiony. To jest kod, na który nie można się zatrzymać, jest wbudowany w przeglądarkę internetową.

Możesz obejść go, ustawiając widoczność natywnego widoku tekstowego na View.GONE. Jeśli potrzebujesz więcej informacji o tym, jak to zrobić, daj mi znać!

Edycja: Właśnie sprawdziłem kod źródłowy dla Jellybean, i to zachowanie się zmieniło. Nie ma natywnej nakładki WebTextView na Jellybean! Być może tablet, na którym widziałeś swoje tło, był tabletem Jellybean. W każdym razie, to co powiedziałem, dotyczy ICS i poniżej.


1
2018-05-27 06:33



Nie wiem o nim, ale chciałbym, aby uzyskać więcej informacji na ten temat, jeśli możesz podać. Jak konkretnie możesz kierować się konkretnie na ten tekst? - caiocpricci2
Jeśli jest to aplikacja internetowa, możesz to zrobić na kilka sposobów. Albo za pomocą ViewTreeObserver (developer.android.com/reference/android/view/...), aby słuchać zmiany ostrości, lub po prostu wywołaj getCurrentFocus () z widoku rodzica. - Bradley Campbell
Spróbuję tego tak szybko, jak tylko będę mógł. Niestety pojawiły się bardziej pilne problemy i nie będę miał czasu, aby spróbować wkrótce. Dopilnuję, abyś otrzymał swoją nagrodę, gdy spróbuję. Dzięki! - Clayton Rabenda
Chłodny. Powinieneś być w stanie, na zdarzeniu zmiany ogniskowania przez ViewTreeObserver, przetestować, czy nowy fokus jest instancją EditText, używając "if (newFocus instanceof EditText)". Jeśli tak, ustaw widoczność, aby zniknęła. - Bradley Campbell