Websiten mit meiner Domain in Webview laden

  • Antworten:11
Nikurasu
  • Forum-Beiträge: 4

21.03.2020, 19:31:03 via Website

Hallo, ich habe folgendes Problem:
Ich will mir eine App für meine Website erstellen. Dabei will ich, dass alle Seiteninterne Links in dem Webview-Container laden und die, die nicht meine Domain haben, sollen mit dem Systembrowser geöffnet werden. Dafür habe ich auch etwas passendes in der Dokumentation gefunden (darf noch keine Links senden, sorry), aber das scheint nicht zu funktionieren, denn beim kompilieren bekomme ich die Errors
Type mismatch: inferred type is Intent but Context was expected
No value passed for parameter 'p1'
No value passed for parameter 'p2'

Kann mir hier jemand helfen? Der Quellcode meiner MainActivity.kt ist:
package com.example.nikurasublog

import android.annotation.SuppressLint
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.core.content.ContextCompat.startActivity

class MainActivity : AppCompatActivity() {

@SuppressLint("SetJavaScriptEnabled")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val myWebView: WebView = findViewById(R.id.webview)
    myWebView.settings.javaScriptEnabled = true
    myWebView.webViewClient = MyWebViewClient()
    myWebView.loadUrl("MeineURL")

}

}
private class MyWebViewClient : WebViewClient() {

override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
    if (Uri.parse(url).host == "MeineDomain") {
        return false
    } else
    Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply {
        startActivity(this)
    }
    return true
}

}

— geändert am 21.03.2020, 19:40:13

Kommentieren
Ludy
  • Admin
  • Forum-Beiträge: 7.958

22.03.2020, 11:48:19 via Website

Hallo Nikurasu,

herzlich willkommen hier im Forum (*)

probiere das so, deins sieht nicht richtig aus.

val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse(url)
startActivity(intent)

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Hilfreich?
Nikurasu
Kommentieren
Nikurasu
  • Forum-Beiträge: 4

24.03.2020, 02:10:56 via Website

Danke für die Antwort, habe mich jetzt noch mal mit dem Problem beschäftigt. Anscheinend scheint es das Hauptproblem zu sein, dass der startActivity-Funktion keinen Intent sondern einen Context erwartet.
Und ich kann irgendwie in der Klasse MyWebViewClient auch nicht ohne den Import von
import androidx.core.content.ContextCompat.startActivity
die Funktion startActivity aufrufen, was in allen anderen Testprojekten von mir aber möglich war
User uploaded photo

Hilfreich?
Kommentieren
Ludy
  • Admin
  • Forum-Beiträge: 7.958

24.03.2020, 05:30:30 via App

Hallo,

ich sehe gerade, du hast die class nicht in deiner Activity, du musst sie in diese verschieben, oder den context als variabel übergeben

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Hilfreich?
Nikurasu
Kommentieren
Nikurasu
  • Forum-Beiträge: 4

24.03.2020, 09:45:06 via Website

Also, ich habe jetzt die Klasse in die MainActivity geschoben, aber immer noch der gleiche Error.
Das ist mittlerweile der Quellcode
hastebin.com/jozikifafo.cpp

Hilfreich?
Kommentieren
Nikurasu
  • Forum-Beiträge: 4

24.03.2020, 10:25:28 via Website

Und wenn ich die Klasse Webview in die onCreate Funktion schiebe, dann habe ich zwar keinen Error mehr bei startActivity, aber eine unresolved Reference bei myWebView.webViewClient = MyWebViewClient()
image

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

24.03.2020, 11:45:00 via Website

entweder die Klasse auflösen und die Methoden implizit überschreiben oder in einer eigenen Datei definieren (wenn man das bei Kotlin so machen muss, keine Ahung..)

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

24.03.2020, 13:32:49 via Website

Hallo versuche mal die innere Klasse auf public zu setzen bin mir nicht sicher ob das default publick auch da gültig ist.

Eigentlich ist es in Kotlin auch so das innerre klassen mit den operator
"inner" erstellt werden.

inner class MyWebViewClient : WebViewClient() {......

ansonsten so.

    webView.webViewClient = object : WebViewClient() {
        override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
        ....

— geändert am 24.03.2020, 14:29:38

Hilfreich?
LudyPascal P.
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

24.03.2020, 13:45:48 via Website

@pascal
In Kotlin muss nicht jede Klasse in einer eigenen Datei sein.
Ist zwar empfehlenswert aber nicht Pflicht.

Hilfreich?
Pascal P.
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

24.03.2020, 14:37:06 via App

Danke für die Info, ich kenne Kotlin aktuell kaum, daher waren das wir gesagt Vermutungen

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Ludy
  • Admin
  • Forum-Beiträge: 7.958

24.03.2020, 15:37:23 via Website

Hier die Ergänzung zu Jokel seiner Antwort

class MainActivity : AppCompatActivity() {

    @SuppressLint("SetJavaScriptEnabled")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val myWebView: WebView = findViewById(R.id.webview)
        myWebView.settings.javaScriptEnabled = true
        myWebView.webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView, url: String?): Boolean {
                if (Uri.parse(url).host == "MeineDomain") {
                    return false
                } else
                    val intent = Intent(Intent.ACTION_VIEW)
                    intent.data = Uri.parse(url)
                    startActivity(intent)
                    return true
                }
            }
        }
        myWebView.loadUrl("MeineURL")

    }
}

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

25.03.2020, 11:15:34 via Website

Hallo noch mal zu dem Thema Inner Kasse.
In deinem Letzen Code „Bild“ ist es auch so das du versuchst die Innere Klasse innerhalb der onCreate Methode zu erstellen .
Das geht nicht ist falsch. Hat mit OOP regeln egal ob nun Java oder Kotlin nichts zu tun.

Hättest du die Kasse richtig erstellt ohne das Wörtchen „inner“ würde „startAticity“ wieder Rot sein.
Mit richtig meine ich innerhalb der MainActivity aber nicht in einer Methode.
Hier der Code in der Form wie er mit einer Inneren Klasse aussehen sollte. Denn dadurch sieht der Code übersichtlicher aus.
In den meisten Tutorial wird die Form mit dem direkt erstellten Objekt bevorzugt. So wie ich es auch schon in kurtz Form und @ludy in lang Form gezeigt haben.
Hier nun die Variante mit „inner“ als richtige Klasse.

 class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val myWebView: WebView = findViewById(R.id.webview)
        myWebView.settings.javaScriptEnabled = true
        myWebView.webViewClient = MyWebViewClient()
        myWebView.loadUrl("http://www.google.de/")

    }

     inner class MyWebViewClient : WebViewClient() {

        override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
            if (Uri.parse(url).host == "http://www.google.de/") {
                return false
            } else{
                val intent = Intent(Intent.ACTION_VIEW)
                intent.data = Uri.parse(url)
                startActivity(intent)
                return true
            }

        }

    }

}

— geändert am 25.03.2020, 11:28:25

Hilfreich?
Kommentieren