【问题标题】:How to load webView from custom position number in Android如何从Android中的自定义位置编号加载webView
【发布时间】:2020-01-02 13:10:43
【问题描述】:

在我的应用程序中,我想使用 horizo​​ntal swipe 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
    }
}

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

【问题讨论】:

  • 设置 currentPage = 3 然后试试看。并更改 turnPageLeft 方法的条件。
  • @ViralPatel 那将是静态选项。而是创建一个构造函数并在其中设置当前位置,这样您就可以传递您想要的任何位置。
  • @ViralPatel,我更改了 currentPage 但没有更改任何页面!但我怎样才能改变 turnLeft 方法?你能把代码发给我吗?请
  • @VirRajpurohit,谢谢我的朋友。你能把代码发给我吗?请。我真的需要你的帮助

标签: java android kotlin webview android-webview


【解决方案1】:

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

在您的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")

注意:您可以在上述项目的 github 链接中提出问题。上面的代码只是快速的伪代码,需要更多的验证和改进。

如果它适合你,请告诉我。

【讨论】:

    【解决方案2】:

    根据您的要求,不要在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 Horizo​​ntalWebView.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 值。

    希望对你有帮助……!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多