Ich versuche, einige einfache App basierend auf WebView zu entwickeln, und ermöglichen den Austausch von Daten zwischen Android-App und Remote-Seite.Zugriff auf von OnCreate von außen deklariertes Webview?
Problembeschreibung:
loadURL arbeitet innerhalb onCreate, aber nicht von außen onCreate arbeiten. Bitte beachten Sie folgenden Code und erklären, was ich falsch gemacht, warum es nicht funktioniert innerhalb WebAppInterface Klasse:
public class MainActivity extends Activity {
public WebView view1;
@Override
protected void onCreate(Bundle savedInstanceState) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String url = "htxx://mydomain.com/";
final WebView view1 =(WebView) this.findViewById(R.id.webView);
view1.addJavascriptInterface(new WebAppInterface(this), "Android"); //exchange between web-js and webview
WebSettings webSettings = view1.getSettings();
webSettings.setJavaScriptEnabled(true);
view1.loadUrl(url);
view1.setWebViewClient(new com.example.project.MyAppWebViewClient() {
@Override
public void onPageFinished(WebView view1, String url) {
findViewById(R.id.progressBar1).setVisibility(View.GONE);
findViewById(R.id.webView).setVisibility(View.VISIBLE);
}
});
view1.setInitialScale(100);
///// ---> That's works:
view1.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
view1.loadUrl("javascript:somescript('Page is loaded')");
}
});
///// ---> That's works too:
Button btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String device_id = tm.getDeviceId();
view1.loadUrl("javascript:somescript('"+device_id+"')");
}
});
}
public class WebAppInterface {
Context mContext;
WebAppInterface(Context c) {
mContext = c;
}
@JavascriptInterface
public void showToast(String toast) {
//show toast from web-app (js to android)
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
@JavascriptInterface
public void printFromWeb() {
//show toast from web-app (js to android)
///// ---> That's NOT working :(
view1.loadUrl("javascript:somescript('Checking loadurl from outside of onCreate')");
}
}
}
Interessant, dass keine Fehler in Android Studio auftritt.
Vielen Dank, jetzt ist es Arbeit! Aber ich verstehe Ihre letzte Empfehlung nicht, und ich bekomme die gleiche (wie Sie beschrieben haben) Nachricht in logcat: _Warnung: Eine WebView-Methode wurde im Thread 'WebViewCoreThread' aufgerufen. Alle WebView-Methoden müssen im UI-Thread aufgerufen werden. Zukünftige Versionen von WebView unterstützen möglicherweise die Verwendung in anderen Threads nicht. _ – deeplay
@deeplay, das Problem besteht darin, dass das Aufrufen der Methode beim Anzeigen von Nachkommen aus dem externen UI-Thread die Regel unterbricht _ "nicht auf das UI-Toolkit von außerhalb des UI-Threads zugreifen" _. [http://nickthecoder.wordpress.com/2013/01/31/updating-ui-from-another-thread-in-android](Here) ist ein Artikel, der es klarer machen sollte. Unterdessen aktualisiere ich meinen Beitrag mit dem relevanten Ausschnitt – xAF
_ [OOPS! DIESE SEITE KANN NICHT GEFUNDEN WERDEN.] (Https://nicktcoder.wordpress.com/2013/01/31/updating-ui-from-another-thread-in-androi%E2%80%8C%E2%80% 8Bd) _ – deeplay