Я пытаюсь разработать некоторое простое приложение на основе WebView и сделать возможным обмен данными между Android-приложением и удаленной страницей.Как получить доступ к Webview, объявленному в onCreate извне?
Описание проблемы:
loadUrl работает в OnCreate, но не работает из-за пределов OnCreate. Пожалуйста, смотрите ниже код и объяснить, что я делаю неправильно, почему это не работает в классе WebAppInterface:
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')");
}
}
}
Интересно, что не все ошибки происходят в Android студии.
Большое спасибо, теперь это работа! Но я не понимаю вашу последнюю рекомендацию, и я получаю то же (как вы описали) сообщение в logcat: _Warning: В потоке 'WebViewCoreThread' был вызван метод WebView. Все методы WebView должны быть вызваны в потоке пользовательского интерфейса. Будущие версии WebView могут не поддерживать использование в других потоках. – deeplay
@deeplay, проблема в том, что метод вызова на потоке представления из потока внешнего потока прерывает правило _ «не обращайтесь к инструментарию Android UI из-за пределов пользовательского интерфейса» _. [http://nickthecoder.wordpress.com/2013/01/31/updating-ui-from-another-thread-in-android](Here) - это статья, которая должна сделать ее более ясной. Между тем, я обновлю свой пост соответствующим фрагментом – xAF
_ [OOPS! ЭТО СТРАНИЦА НЕ МОЖЕТ БЫТЬ НАЙДЕН.] (Https://nickthecoder.wordpress.com/2013/01/31/updating-ui-from-another-thread-in-androi%E2%80%8C%E2%80% 8Bd) _ – deeplay