2013-06-02 18 views
13

Khi tôi tập trung vào trường biểu mẫu ở cuối chế độ xem iScroll, nó sẽ không cuộn lên/đưa trường được tập trung phía trên softkeyboad. Bất kỳ ý tưởng? Cảm ơn bạn!Cách đưa trường tập trung vào chế độ xem bằng cách sử dụng iscroll và Android WebView

field field

Đây là dự án Android. https://dl.dropboxusercontent.com/u/75818136/webkitdemo.zip

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8"> 
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"> 
<title>iScroll demo: simple</title> 

<style type="text/css" media="all"> 
body,ul,li { 
    padding:0; 
    margin:0; 
    border:0; 
} 

body { 
    font-size:12px; 
    -webkit-user-select:none; 
    -webkit-text-size-adjust:none; 
    font-family:helvetica; 
} 

#header { 
    position:absolute; z-index:2; 
    top:0; left:0; 
    width:100%; 
    height:45px; 
    line-height:45px; 
    background-color:#d51875; 
    background-image:-webkit-gradient(linear, 0 0, 0 100%, color-stop(0, #fe96c9), color-stop(0.05, #d51875), color-stop(1, #7b0a2e)); 
    background-image:-moz-linear-gradient(top, #fe96c9, #d51875 5%, #7b0a2e); 
    background-image:-o-linear-gradient(top, #fe96c9, #d51875 5%, #7b0a2e); 
    padding:0; 
    color:#eee; 
    font-size:20px; 
    text-align:center; 
} 

#header a { 
    color:#f3f3f3; 
    text-decoration:none; 
    font-weight:bold; 
    text-shadow:0 -1px 0 rgba(0,0,0,0.5); 
} 

#footer { 
    position:absolute; z-index:2; 
    bottom:0; left:0; 
    width:100%; 
    height:48px; 
    background-color:#222; 
    background-image:-webkit-gradient(linear, 0 0, 0 100%, color-stop(0, #999), color-stop(0.02, #666), color-stop(1, #222)); 
    background-image:-moz-linear-gradient(top, #999, #666 2%, #222); 
    background-image:-o-linear-gradient(top, #999, #666 2%, #222); 
    padding:0; 
    border-top:1px solid #444; 
} 

#wrapper { 
    position:absolute; z-index:1; 
    top:45px; bottom:48px; left:0; 
    width:100%; 
    background:#aaa; 
    overflow:auto; 
} 

#scroller { 
    position:absolute; z-index:1; 
/* -webkit-touch-callout:none;*/ 
    -webkit-tap-highlight-color:rgba(0,0,0,0); 
    width:100%; 
    padding:0; 
} 

#scroller ul { 
    list-style:none; 
    padding:0; 
    margin:0; 
    width:100%; 
    text-align:left; 
} 

#scroller li { 
    padding:0 10px; 
    height:40px; 
    line-height:40px; 
    border-bottom:1px solid #ccc; 
    border-top:1px solid #fff; 
    background-color:#fafafa; 
    font-size:14px; 
} 
</style> 

<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript" src="iscroll.js"></script> 

</head> 
<body> 

<div id="header"><a href="http://cubiq.org/iscroll">iScroll</a></div> 
<div id="wrapper"> 
    <div id="scroller"> 
     <ul id="thelist"> 
      <li>Pretty row 1</li> 
      <li>Pretty row 2</li> 
      <li>Pretty row 3</li> 
      <li>Pretty row 4</li> 
      <li>Pretty row 5</li> 
      <li>Pretty row 6</li> 
      <li>Pretty row 7</li> 
      <li>Pretty row 8</li> 
      <li>Pretty row 9</li> 
      <li>Pretty row 10</li> 
      <li>Pretty row 11</li> 
      <li>Pretty row 12</li> 
      <li>Pretty row 13</li> 
      <li>Pretty row 14</li> 
      <li>Pretty row 15</li> 
      <li>Pretty row 16</li> 
      <li>Pretty row 17</li> 
      <li>Pretty row 18</li> 
      <li>Pretty row 19</li> 
      <li>Pretty row 20</li> 
      <li>Pretty row 21</li> 
      <li>Pretty row 22</li> 
      <li>Pretty row 23</li> 
      <li>Pretty row 24</li> 
      <li>Pretty row 25</li> 
      <li>Pretty row 26</li> 
      <li>Pretty row 27</li> 
      <li>Pretty row 28</li> 
      <li>Pretty row 29</li> 
      <li>Pretty row 30</li> 
      <li>Pretty row 31</li> 
      <li>Pretty row 32</li> 
      <li>Pretty row 33</li> 
      <li>Pretty row 34</li> 
      <li>Pretty row 35</li> 
      <li>Pretty row 36</li> 
      <li>Pretty row 37</li> 
      <li>Pretty row 38</li> 
      <li>Pretty row 39</li> 
      <li><form><input type="text" value="hey" spellcheck="false"></form></li> 
     </ul> 
    </div> 
</div> 
<div id="footer"></div> 

<script> 

var myScroll; 
function loaded() { 
    myScroll = new iScroll('wrapper'); 
} 

document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false); 
document.addEventListener('DOMContentLoaded', function() { setTimeout(loaded, 200); }, false); 
window.addEventListener("resize", function() { 
    console.error("=------======-=-=-=="); 
}, false); 


</script> 

</body> 
</html> 
+0

Làm thế nào về liên kết này. http://stackoverflow.com/questions/7026854/textbox-hidden-below-keyboard-in-android-webview –

+0

sẽ không hoạt động. Tôi đã thử điều này: P –

Trả lời

7

Cuối cùng tôi đã tìm được giải pháp cho câu hỏi của mình. BTW, giải pháp này sẽ có trong cuốn sách của tôi sẽ sớm được xuất bản. Tôi chỉ muốn chia sẻ điều này với cộng đồng nhà phát triển.

Trước hết, iscroll nên xử lý vấn đề này cho chúng tôi, nhưng bằng cách nào đó nó không.

Ngoài ra, tôi nghĩ rằng có lỗi trong API Android. Khi tôi sử dụng chế độ toàn màn hình (trong tệp kê khai hoặc theo chương trình), sự kiện "thay đổi kích thước" sẽ không được kích hoạt trong WebView. Không biết tại sao. Tôi đã báo cáo lỗi này cho nhóm Android. Nếu bạn biết tại sao điều này xảy ra, vui lòng cho chúng tôi biết tại đây. Cảm ơn.

android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 

// or 

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

Dưới đây là giải pháp:

tôi loại bỏ các chế độ toàn màn hình. Thay vào đó, tôi đã sử dụng res/values/style.xml, requestWindowFeature(android.view.Window.FEATURE_NO_TITLE);android:theme="@style/Theme" trong ứng dụng để xóa tiêu đề gốc của ứng dụng. Giải pháp này cũng hoạt động khi định hướng xảy ra.

Sau đó, sử dụng sự kiện "lấy nét", tôi đã chụp thành phần nào có tiêu điểm.

var $elm; 

$('input, textarea').bind('focus', function(e) { 
    console.error("onFocus"); 
    $elm = $(this); 
}); 

Sau đó, sử dụng đối tượng "thay đổi kích thước", tôi làm mới đối tượng iscroll và sau đó cuộn đến $ elm.

$(window).bind('resize', function() { 
    console.error("onResize"); 
    if (myScroll !== undefined) { 
     setTimeout(function() { 
      myScroll.refresh(); 
      myScroll.scrollToElement($elm[0], 200); 
     }, 100); 
    } 
}); 

This is the answer to my question, WebKitDemo2.zip

+0

Liên kết không hợp lệ nữa. Vui lòng cập nhật liên kết hoặc cho biết cách sử dụng giải pháp của bạn. –

2

Tôi không chắc đây có phải là câu trả lời hay cho câu hỏi của bạn hay không. Tôi đã gặp phải sự cố tương tự với soft keyboard & iscroll trong thiết bị POS. Để sắp xếp vấn đề này, tôi đã thực hiện công việc STUPID.

Các bước tôi đã làm.

Giả sử bạn gắn iScroll như

iScrollObj = new iScroll này ('ID');

  1. Tôi nối thêm một trình bao bọc div trống bên trong hộp chứa cuộn cuối cùng nếu tôi có đầu vào.
  2. Khi yếu tố đầu vào được tập trung nhưng trước khi bàn phím bật lên tôi tính toán vị trí của các lĩnh vực đầu vào (pi) và chiều cao của đầu vào (hi)
  3. tôi nhận được chiều cao của màn hình (hs), chiều cao của bàn phím (hk)
  4. Bằng cách sử dụng hs, hk, hipi Tôi đã tính chiều cao cho trình bao bọc div trống và được gán cho nó.
  5. Để tránh sự thất vọng tôi đã sử dụng iScrollObj.refresh() gọi lại chức năng. (Bởi vì tôi đã tự động gán chiều cao div wrapper, iScroll đôi khi phản ứng một cách chính xác để điều chỉnh năng động nhưng đôi khi nó không thành công)
  6. Sau đó, tôi đã sử dụng iScrollObj.scrollTo(x, y, time) iScroll hàm callback để di chuyển đầu vào lên
  7. Khi tôi ẩn bàn phím, tôi đặt chiều cao trình bao bọc div trống thành 0
  8. Bây giờ bạn phải đặt lại. iScrollObj.refresh()iScrollObj.scrollTo(x, y, time)

Bạn vẫn có thể sử dụng iScrollObj.scrollToElement(element, time) nhưng tôi nghĩ điều này hiệu quả hơn. Vì element nên là CSS selector của phần tử trong đó iScroll tự động cuộn đến phần tử đó, trong đó nó hiển thị phần tử đó ở vị trí trên cùng trong chế độ xem. Nó có nghĩa là trong màn hình bạn đã đính kèm sẽ nói nếu bạn sử dụng CSS selector của Pretty row 34 thì nó sẽ hiển thị từ Pretty row 34 xuống dưới.

Xin lưu ý

Soft keyboard mà tôi sử dụng được phát triển bởi tôi (Đây là một plugin jQuery) do đó tôi đã có thể thực hiện tất cả các chức năng gọi lại yêu cầu. iScroll đã cung cấp nhiều chức năng gọi lại.

Vì vậy, tôi có thể hoàn thành nhiệm vụ của mình và hoạt động chính xác mà không có bất kỳ vấn đề nào như chúng tôi mong đợi.

Tôi không biết các ràng buộc bạn có. Chỉ cần chia sẻ công việc STUPID những gì tôi đã làm.

Xin lỗi nếu đây không phải là giải pháp phù hợp với bạn.

Cảm ơn.

+0

Thành thật mà nói, tôi không tìm kiếm một hack. Mặc dù điều này có thể hiệu quả nhưng tôi đang tìm một giải pháp trực quan. Nó cũng có thể là ví dụ iScroll sử dụng 'vị trí: tuyệt đối;' mà tôi không phải là fan của. Có thể sự cố cũng có thể nằm trong CSS. - nizam – Nizzy

+0

@Nizzy: Vâng tôi biết giải pháp của mình là trực quan. Nếu bạn tìm thấy một giải pháp xin vui lòng cập nhật nó ở đây để trong tương lai nó có thể giúp tôi giải quyết những tình huống này. Tôi đã cố gắng rất nhiều cách để tìm giải pháp sau đó tôi đã sử dụng hack này .. :) –

Các vấn đề liên quan