如何从 Android 中的自定义位置编号加载 webView

How to load webView from custom position number in Android

在我的应用程序中,我想使用 水平滑动 webview 为此,我在下面找到了库。
https://github.com/GautamChibde/Android-Horizontal-Swipe-WebView

但我希望起始页是我的自定义页码,但它总是从第一页开始。
例如,我想从第3页开始。

此自定义 webView 代码:

class HorizontalWebView2(context: Context,
                         attrs: AttributeSet) : WebView(context, attrs) {
    private var x1 = -1f
    private var pageCount = 0
    private var currentPage = 0
    private var currentX = 0
    private var delta: Int = 30
    private var pageNumber: Int = 1

    private val prevPagePosition: Int
        get() = ceil((--currentPage * this.measuredWidth).toDouble()).toInt()

    private val nextPagePosition: Int
        get() = ceil((++currentPage * this.measuredWidth).toDouble()).toInt()

    init {
        setDelta()
        this.webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView, url: String) {
                injectJavascript()
            }
        }

        this.webChromeClient = object : WebChromeClient() {
            override fun onJsAlert(view: WebView, url: String, message: String, result: JsResult): Boolean {
                val pageCount = Integer.parseInt(message)
                this@HorizontalWebView2.setPageCount(pageCount)
                injectCSS()
                result.confirm()
                return true
            }
        }
    }

    private fun setDelta() {
        val displayMetrics = DisplayMetrics()
        (context as Activity).windowManager.defaultDisplay.getMetrics(displayMetrics)
        delta = (displayMetrics.widthPixels * 0.04).toInt()
    }

    @SuppressLint("ClickableViewAccessibility")
    override fun onTouchEvent(event: MotionEvent): Boolean {
        when (event.action) {
            MotionEvent.ACTION_MOVE -> super.onTouchEvent(event)
            MotionEvent.ACTION_DOWN -> {
                x1 = event.x
                return super.onTouchEvent(event)
            }
            MotionEvent.ACTION_UP -> {
                val x2 = event.x
                val deltaX = x2 - x1
                if (abs(deltaX) > delta) {
                    // Left to Right swipe action
                    return if (x2 > x1) {
                        turnPageLeft(deltaX)
                        true
                    } else {
                        turnPageRight(deltaX)
                        true
                    }// Right to left swipe action
                }
            }
            else -> super.onTouchEvent(event)
        }
        return super.onTouchEvent(event)
    }

    private fun turnPageLeft(deltaX: Float) {
        if (currentPage > 0) {
            val scrollX = prevPagePosition
            loadAnimation(scrollX, deltaX)
            currentX = scrollX
            scrollTo(scrollX, 0)
            pageNumber--
            EventBus.getDefault().post(EventPageNumber(pageNumber))
        }
    }

    private fun turnPageRight(deltaX: Float) {
        if (currentPage < pageCount - 1) {
            val scrollX = nextPagePosition
            loadAnimation(scrollX + PADDING_OFFSET, deltaX)
            currentX = scrollX + PADDING_OFFSET
            scrollTo(scrollX + PADDING_OFFSET, 0)
            pageNumber++
            EventBus.getDefault().post(EventPageNumber(pageNumber))
        }
    }

    private fun loadAnimation(scrollX: Int, deltaX: Float) {
        val anim = ObjectAnimator.ofInt(this, "scrollX",
                currentX - deltaX.toInt(), scrollX)
        anim.duration = SCROLL_DURATION
        anim.interpolator = LinearInterpolator()
        anim.start()
    }

    private fun injectJavascript() {
        val js = "function initialize(){\n" +
                "    var d = document.getElementsByTagName('body')[0];\n" +
                "    var ourH = window.innerHeight - 40;\n" +
                "    var ourW = window.innerWidth - (2*20);\n" +
                "    var fullH = d.offsetHeight;\n" +
                "    var pageCount = Math.floor(fullH/ourH)+1;\n" +
                "    var currentPage = 0;\n" +
                "    var newW = pageCount*window.innerWidth - (2*20);\n" +
                "    d.style.height = ourH+'px';\n" +
                "    d.style.width = newW+'px';\n" +
                "    d.style.margin = 0;\n" +
                "    d.style.webkitColumnGap = '40px';\n" +
                "    d.style.webkitColumnCount = pageCount;\n" +
                "    document.head.innerHTML = document.head.innerHTML + '<meta name=\"viewport\" content=\"height=device-height, user-scalable=no\" />';" +
                "    return pageCount;\n" +
                "}"
        this.loadUrl("javascript:$js")
        this.loadUrl("javascript:alert(initialize())")
    }

    private fun injectCSS() {
        this.loadUrl("javascript:(function() {" +
                "var parent = document.getElementsByTagName('head').item(0);" +
                "var style = document.createElement('style');" +
                "style.type = 'text/css';" +
                "style.innerHTML = 'body { padding: 20px 20px !important; }';" +
                "parent.appendChild(style)" +
                "})()")
    }

    fun setPageCount(pageCount: Int) {
        this.pageCount = pageCount
    }

    fun getPageCount(): Int {
        return pageCount
    }

    companion object {
        const val SCROLL_DURATION: Long = 400
        const val PADDING_OFFSET = 10
    }
}

如何修复它并从自定义页码开始?

我正在编写下面的伪代码,您可以通过它了解库代码的工作原理。

在您的 HorizontalWebView.kt 中创建如下方法

fun setPageNumber(number: Int) {
        val displayMetrics = DisplayMetrics()
        (context as Activity).windowManager.defaultDisplay.getMetrics(displayMetrics)
        currentX = (number * displayMetrics.widthPixels) + PADDING_OFFSET
        scrollTo(currentX + PADDING_OFFSET, 0)
    } 

现在从您的 MainActivity.kt 调用上面的方法。

val wv = findViewById<HorizontalWebView>(R.id.web_view)
        wv.setPageNumber(3)// Page you want to load
        wv.settings.javaScriptEnabled = true
        wv.loadUrl("file:///android_asset/ch03.html")

NOTE: You can raise as an issue in github link for above project. The above code is just quick pseudo code which requires more validations and improvement.

请告诉我它是否适合你。

根据您的要求,不在 currentPage

上传递静态值

FirstActivity.kt

val showButton = findViewById<Button>(R.id.button)
val editText = findViewById<EditText>(R.id.editText)

// Setting On Click Listener
showButton.setOnClickListener {
    // Getting the user input
    if(editText.text.trim().toString().isEmpty()){
        editText.setText("0")
    }
    var textGet = editText.text
    val intent = Intent(this@FirstActivity,MainActivity::class.java)
    intent.putExtra("number",textGet.toString().toInt())
    startActivity(intent)
}

MainActivity.kt

var number = intent.getIntExtra("number",0)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    WebView.setWebContentsDebuggingEnabled(true)
}
val wv = findViewById<HorizontalWebView>(R.id.web_view)
wv.settings.javaScriptEnabled = true
wv.setPageNumber(number)
wv.loadUrl("file:///android_asset/ch03.html")

然后关注@Vir Rajpurohit HorizontalWebView.kt

fun setPageNumber(number: Int) {
    val displayMetrics = DisplayMetrics()
    (context as Activity).windowManager.defaultDisplay.getMetrics(displayMetrics)
    currentX = (number * displayMetrics.widthPixels) + PADDING_OFFSET
    scrollTo(currentX + PADDING_OFFSET, 0)
}

如果我们直接点击 NEXT Button 然后传递 0 值。

希望对您有所帮助...!