2016-03-25 3 views
0

Я пытаюсь разработать некоторое простое приложение на основе 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 студии.

ответ

2

Вы public WebView view1; как поле и совершенно иной окончательный view1 внутри onCreate(), так что на самом деле нуль в методе public void printFromWeb().


Вот безопасный маршрут, чтобы пойти:

Чтобы получить доступ к WebView "снаружи", добавить частное поле класса WebView:

private WebView webView; 

В вашем методе onCreate(), его экземпляр:

webView = (WebView) findViewById(R.id.webView); 

Добавить метод получения доступа к экземпляру:

public WebView getWebView() { 
    return webView; 
} 

И помните, что касается только касания резьбы UI.


Update: как безопасно получить доступ мнения не-Ui теме:

MainActivity.this.runOnUiThread(new Runnable() { 
    @Override 
    public void run(){ 
     view1.loadUrl(...) 
    } 
}) 
+0

Большое спасибо, теперь это работа! Но я не понимаю вашу последнюю рекомендацию, и я получаю то же (как вы описали) сообщение в logcat: _Warning: В потоке 'WebViewCoreThread' был вызван метод WebView. Все методы WebView должны быть вызваны в потоке пользовательского интерфейса. Будущие версии WebView могут не поддерживать использование в других потоках. – deeplay

+1

@deeplay, проблема в том, что метод вызова на потоке представления из потока внешнего потока прерывает правило _ «не обращайтесь к инструментарию Android UI из-за пределов пользовательского интерфейса» _. [http://nickthecoder.wordpress.com/2013/01/31/updating-ui-from-another-thread-in-android](Here) - это статья, которая должна сделать ее более ясной. Между тем, я обновлю свой пост соответствующим фрагментом – xAF

+0

_ [OOPS! ЭТО СТРАНИЦА НЕ МОЖЕТ БЫТЬ НАЙДЕН.] (Https://nickthecoder.wordpress.com/2013/01/31/updating-ui-from-another-thread-in-androi%E2%80%8C%E2%80% 8Bd) _ – deeplay

Смежные вопросы