2013-05-16 51 views
11

Android WebKit vẽ nền trắng + đường viền trên văn bản và đầu vào khi chúng có tiêu điểm. Làm thế nào để tôi ngừng làm điều đó?Textarea tập trung vào Android WebKit sẽ không vẽ hình nền

no background image on focused textarea

tôi đã cố gắng thay đổi -webkit-tap-điểm nhấn màu, -webkit-xuất hiện, -webkit-backface-tầm nhìn, phác thảo, và một số thứ khác, không có gì có vẻ làm việc. Cứu giúp!

Trả lời

8

EDIT

Ok, vậy quên đi mọi thứ tôi đã trả lời trước đó. Tôi đã chạy một số xét nghiệm và điều này có vẻ là một vấn đề trên Android 4.0.3 chỉ. Và có một số tin xấu.

Tôi bắt đầu đào sâu vào nguồn và tôi tin rằng sự cố nằm trên lớp WebTextView. Lớp học xử lý textviews và textareas.

Nếu bạn thấy trên các dòng 233-240, phương pháp vẽ nền luôn vẽ hình chữ nhật màu xanh và hình chữ nhật màu trắng bên trong. Đó là chính xác những gì ảnh chụp màn hình của bạn hiển thị.

Một giải pháp tốt sẽ là mở rộng lớp này và sửa nó. Thật không may là there is no WebTextView class in the sdk. Có nghĩa là bạn không thể ghi đè lên nó.

Tôi đã thử tất cả các loại javascript để thay đổi màu văn bản, even overlapping the element nhưng không hiệu quả. Nó không phải là một cái gì đó chúng ta có thể đạt được từ bên trong mã html.

Vì vậy, bạn không thể sửa lỗi trên java và bạn không thể sửa lỗi trên javascript. Tôi e rằng không có giải pháp cho vấn đề này.

EDIT

Tôi đứng sửa chữa. Nhờ @grandstaish cho đề xuất lấy nét, chúng ta có thể dễ dàng thay đổi màu nền sau khi tạo TextView. Tôi đã cố gắng sử dụng ViewTreeObserver cho một giải pháp thanh lịch nhưng tôi không thể chỉ nhắm mục tiêu các lượt xem mà tôi muốn. Mỗi TextView sẽ có một nền trong suốt và tôi không muốn điều đó. Vì vậy, một cách tiếp cận lai giải quyết nó:

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);   
} 

Java:

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);    
     } 
    }); 

} 

Vì vậy, chúng ta có thể kiểm soát các yếu tố trên trang sẽ kích hoạt thay đổi nền. Tôi không thể tìm thấy bất kỳ tác dụng phụ không mong muốn này nhưng tôi không có thời gian để kiểm tra nó trong tất cả các phiên bản, vì vậy tôi đã chọn giới hạn nó thành 4.0.3, phiên bản duy nhất tôi có thể tìm ra vấn đề đó.

+0

Tôi đã thấy công việc này trên một số phiên bản Android (Tôi không biết phiên bản nào, máy tính bảng đó đã bị đập vỡ). Trên máy tính bảng hiện tại của tôi chạy 4.0.x, nó không hoạt động ... Bạn đang chạy phiên bản Android nào? –

+0

Đó là một vấn đề trên 4.0.3 chỉ rõ ràng. Và theo như tôi có thể nói không có giải pháp. – caiocpricci2

+0

Cuối cùng tôi đã có thời gian để quay trở lại điều này. Tôi thực sự chỉ overrode OnHierarchyChangeListener của weebview và thiết lập mọi view thành minh bạch trong onChildViewAdded. Như bạn đã nói, tôi không thể chọn cái nào sẽ có cái này, nhưng cái này làm việc cho ứng dụng cụ thể của tôi. Cảm ơn rất nhiều vì đã dành thời gian để giúp tôi! : D: D –

1

Android đặt chế độ xem văn bản gốc ở đầu trường văn bản web khi được lấy nét. Đây là mã mà bạn không thể dừng lại xảy ra, nó được xây dựng trong webview.

Bạn có thể làm việc xung quanh nó bằng cách đặt chế độ hiển thị của chế độ xem văn bản gốc thành Chế độ xem.GONE. Nếu bạn cần thêm thông tin về cách thực hiện việc này, hãy cho tôi biết!

Chỉnh sửa: Tôi vừa kiểm tra mã nguồn cho Jellybean và hành vi này dường như đã thay đổi. Không có lớp phủ WebTextView gốc trên Jellybean! Có lẽ chiếc máy tính bảng mà bạn thấy nền của mình là một viên thuốc Jellybean. Dù sao, những gì tôi nói vẫn áp dụng cho ICS và dưới đây.

+0

Không biết về anh ta nhưng tôi rất thích cần thêm thông tin về điều này nếu bạn có thể cung cấp. Làm cách nào để bạn có thể nhắm mục tiêu cụ thể đến lượt xem văn bản đó? – caiocpricci2

+0

Nếu ứng dụng này dành cho ứng dụng web, có một số cách bạn có thể thực hiện. Hoặc sử dụng ViewTreeObserver (http://developer.android.com/reference/android/view/ViewTreeObserver.html) để nghe thay đổi tập trung, hoặc chỉ gọi getCurrentFocus() từ chế độ xem gốc. –

+0

Tôi sẽ thử điều này ngay khi có thể. Rất tiếc, các vấn đề khẩn cấp hơn đã xuất hiện và tôi sẽ không có thời gian để thử sớm. Tôi sẽ chắc chắn rằng bạn nhận được tiền thưởng của bạn khi tôi thử nó mặc dù. Cảm ơn! –