나는 로컬 HTML 파일을 가지고 있으며 무한 스크롤 방법으로 보여주고 싶다.안드로이드 webview에서 무한 스크롤
참고 : 나는 HTML 콘텐츠를 변경할 수 없으므로 자바 스크립트를 추가하는 데 도움이되지 마십시오. 나는 그것을 실행 시간에해야한다.
그래서 나는 을 통해 런타임에 javascript
을 실행할 수 있다고 생각했습니다.
onOverScrolled()
메서드를 webView
으로 대체하여 사용자가 언제 webView의 끝에 도달하는지 확인합니다. (신중하게 행동하므로 여기에 문제가 없습니다)
문제가 몇 번이고 새로운 콘텐츠가 성공적으로 첨부되었지만 다른 시간에는 첨부되지 않았습니다.
로그에서 볼 때 페이지 메서드의 끝이 트리거된다는 것을 알 수 있습니다. 새 html body를 검색하면 호출되는 자바 스크립트 코드가 실행되지만 영향을 미치지는 않습니다.
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY)
{
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
if(clampedY & reloadFlag) //for first time realodFlag is false, when the WebViewClient.onPageFinished() get called it turn to ture
{
if (!(isVerticalScrollPossible(SCROLL_DOWN)))
{
reloadFlag = false;
currUri = nextResource(currUri); //findout next page
appendNextPage();
}
}
}
private final int SCROLL_DOWN = 1;
private final int SCROLL_UP = -1;
private boolean isVerticalScrollPossible(int direction)
{
final int offset = computeVerticalScrollOffset();
final int range = computeVerticalScrollRange() - computeVerticalScrollExtent();
if (range == 0) return false;
if (direction < 0) {
return offset > 0;
} else {
return offset < range - 1;
}
}
public String getNextPageJS(Uri currPage)
{
String body = getNextPageBody(currPage);
//Log.d("myTAG", body);
String jsResult = "javascript:(function() { document.body.innerHTML += '<div id=\"separator\" style=\"height:10px; margin-top:10px; margin-bottom:10px; background-color:#000000;\"></div>" + body + "';})()";
return jsResult;
}
private void appendNextPage()
{
reloadFlag = false;
Thread appendThread = new Thread(null, doAppend, "backgroundAppend");
appendThread.start();
Log.i("appendNextPage", "get called");
}
public String rs = "";
private Runnable doAppend = new Runnable()
{
@Override
public void run()
{
Log.i("doAppend", "get called + currUri: " + currUri);
rs = getNextPageJS(currUri);
//loadUrl(rs);
appendHandler.sendEmptyMessage(0);
}
};
private Handler appendHandler = new Handler()
{
public void handleMessage(Message msg)
{
loadUrl(rs);
reloadFlag = true;
Log.i("appendHandler", "get called");
}
};
참고 : 여기
내 코드, 뭔가 잘못 가서 내가 그것을 볼 수 없습니다 수 있습니다 가끔 에뮬레이터 로그 (안 실제 장치에서)이 얻을 :I/chromium(1339): [INFO:CONSOLE(1)] "Uncaught SyntaxError: An invalid or illegal string was specified.", source: http://localhost:1025/OEBPS/Text/Section0042.xhtml (1)
페이지 수는 때때로 다를 수 있습니다. 잘못된 javasccript 코드 일 수 있습니다. 잘 모르겠습니다.
힌트 :
1) 나는 자바 스크립트 코더 아니에요, 그래서 자바 스크립트 코드가
2) 아니면 여러 번이 문제
에게 원인이 자바 스크립트 코드를 호출 좋지 않다 될 수있다 3) 자바 스크립트 코드가 완전히로드 된 후에 실행해야한다는 것을 알고 있습니다. 아마 너무 빨리 호출되는 코드 일 수 있습니다.이 문제는 onPageFinished()가 첫 페이지에만 호출되고 자바 스크립트 코드를 통해 연결된 새 콘텐츠가 호출되지 않는 경우, 내가 스레드를 사용 하여이 문제를 해결하기 위해 노력, 나는 그것이 효과가 있다고 생각한다.
업데이트 : 나는이 코드가 html 본문이 작을 때 잘 작동하지만 큰 본문을 첨부하려고하면 제대로 작동하지 않는다고 알았습니다. loadUrl()
메서드는 문자 제한이 있습니까? 또는 다른 아이디어?