2010-06-03 14 views
13

Piszę aplikację, która łączy się z witryną zaplecza. Strona backoffice zawiera całe mnóstwo funkcji JavaScript, co najmniej 100 razy w stosunku do przeciętnej strony. Niestety nie ładuje ich i powoduje, że znaczna część funkcjonalności nie działa poprawnie. Przeprowadzam test. Umieściłem stronę na moim serwerze, która ładuje tekst javascript FireBugLite. Jest dużo javascript i idealnie sprawdza się i sprawdza, czy Android WebView go załaduje. WebView nie ładuje niczego, ale przeglądarka ładuje ikonę Firebug. Co na ziemi może zrobić różnicę, dlaczego może działać w przeglądarce, a nie w moim WebView? Jakieś sugestie.Android WebView nie ładuje pliku JavaScript, ale przeglądarka internetowa ładuje go dobrze

Więcej informacji, aby uzyskać dostęp do śmierdzącej aplikacji backoffice na Droid (lub jakiejkolwiek innej platformie z wyjątkiem okien) Musiałem oszukać aplikację bakcoffice, aby uwierzyć, że dostęp do witryny to Internet Explorer. Robię to, modyfikując agenta użytkownika WebView.

Również dla tej aplikacji wyszczupliłem moją stronę docelową, więc mogłem dać ci źródło, by zaoferować mi pomoc.

package ksc.myKMB; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.app.ProgressDialog; 
import android.content.DialogInterface; 
import android.graphics.Bitmap; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.Window; 
import android.webkit.WebChromeClient; 
import android.webkit.WebView; 
import android.webkit.WebSettings; 
import android.webkit.WebViewClient; 
import android.widget.Toast; 

public class myKMB extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); /** Performs base set up */ 

     /** Create a Activity of this Activity, IE myProcess */ 
     myProcess = this; 

     /*** Create global objects and web browsing objects */ 
     HideDialogOnce = true; 
     webview = new WebView(this) { 

     }; 
     webChromeClient = new WebChromeClient() { 
     public void onProgressChanged(WebView view, int progress) { 
       // Activities and WebViews measure progress with different scales. 
       // The progress meter will automatically disappear when we reach 100% 
      myProcess.setProgress((progress * 100)); 
      //CreateMessage("Progress is : " + progress); 
       } 
     }; 
     webViewClient = new WebViewClient() { 
      public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
       Toast.makeText(myProcess, MessageBegText + description + MessageEndText, Toast.LENGTH_SHORT).show(); 
       } 
      public void onPageFinished (WebView view, String url) { 
       /** Hide dialog */ 
      try { 
      // loadingDialog.dismiss(); 
      } finally { 

      } 

      //myProcess.setProgress(1000); 
      /** Fon't show the dialog while I'm performing fixes */ 
       //HideDialogOnce = true; 
view.loadUrl("javascript:document.getElementById('JTRANS011').style.visibility='visible';"); 

      } 

      public void onPageStarted(WebView view, String url, Bitmap favicon) { 

     if (HideDialogOnce == false) { 
     //loadingDialog = ProgressDialog.show(myProcess, "", 
       // "One moment, the page is laoding...", true); 
     } else { 
     //HideDialogOnce = true; 
     } 
     } 

    }; 


    getWindow().requestFeature(Window.FEATURE_PROGRESS); 
      webview.setWebChromeClient(webChromeClient); 
    webview.setWebViewClient(webViewClient); 
    setContentView(webview); 


    /** Load the Keynote Browser Settings */ 
    LoadSettings(); 
    webview.loadUrl(LandingPage); 


} 

    /** Get Menu */ 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu, menu); 
    return true; 
    } 

    /** an item gets pushed */ 
    @Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    // We have only one menu option 
    case R.id.quit: 
    System.exit(0); 
    break; 
    case R.id.back: 
    webview.goBack(); 
    case R.id.refresh: 
    webview.reload(); 
    case R.id.info: 
    //IncludeJavascript(""); 
    } 
    return true; 
} 


/** Begin Globals */ 
public WebView webview; 
public WebChromeClient webChromeClient; 
public WebViewClient webViewClient; 
public ProgressDialog loadingDialog; 
public Boolean HideDialogOnce; 
public Activity myProcess; 
public String OverideUserAgent_IE = "Mozilla/5.0 (Windows; MSIE 6.0; Android 1.6; en-US) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Safari/523.12.2 myKMB/1.0"; 
public String LandingPage = "http://kscserver.com/main-leap-slim.html"; 
public String MessageBegText = "Problem making a connection, Details: "; 
public String MessageEndText = " For Support Call: (xxx) xxx - xxxx."; 

public void LoadSettings() { 

webview.getSettings().setUserAgentString(OverideUserAgent_IE); 
webview.getSettings().setJavaScriptEnabled(true); 
webview.getSettings().setBuiltInZoomControls(true); 
webview.getSettings().setSupportZoom(true); 
} 

/** Creates a message alert dialog */ 
public void CreateMessage(String message) { 

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setMessage(message) 
     .setCancelable(true) 
     .setNegativeButton("Close", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
      dialog.cancel(); 
      } 
     }); 
AlertDialog alert = builder.create(); 
alert.show(); 
} 


} 

The background Application is my app, running in an emulator. The top application is the browser. You'll see the browser has the firebug icon, and can activate the firebug, but the application does not have the firebug icon. http://img413.imageshack.us/img413/9628/myapp.gif

Moja aplikacja działa w tle i jak widać nie Firebug w dolnym prawym rogu. Jednak przeglądarka (emulator na górze) ma tę samą stronę, ale pokazuje firebuga. Co ja robię źle? Zakładam, że albo nie ma dostatecznej ilości pamięci przydzielonej do aplikacji, alokacji mocy procesowej, czy pamięci fizycznej. Nie mogę powiedzieć, wiem tylko, że wyniki są dziwne.

Dostaję to samo z mojego urządzenia z Androidem, aplikacja nie pokazuje firebuga, ale przeglądarka pokazuje firebuga.

Mam już włączoną obsługę JavaScript w przeglądarce, problem polega na tym, że widok internetowy działa inaczej niż przeglądarka internetowa.

+0

„Mam już JavaScript w przeglądarce internetowej na” - Czy to znaczy, że zadzwoniłeś setJavaScriptEnabled (prawda) na ustawieniach WebView ? (aby się upewnić ...) –

+0

Tak, to jest w mojej pustce LoadSettings() Którą wywołuję przed załadowaniem strony po dodaniu jej do widoku. – JustinKaz

+0

Nie testowałem, że działa w przeglądarce Android, potrzebuję go do pracy w mojej aplikacji. W jakiś sposób niektóre (nie większość) Javascript nie jest ładowany. Jeśli nie masz nawigacji do http://kscserver.com/main-leap-slim.html z przeglądarką dla Androida, FireBug jest w stanie kliknąć, ale w mojej aplikacji nie wyświetla się, ale mapa Pop-up Javascript nadal działa. – JustinKaz

Odpowiedz

4

Działa doskonale dla mnie. Widzę ikonę FireBug w WebView.

Linia ta jest zła, myślę, że należy go usunąć:

webview.getSettings().setUserAgentString(OverideUserAgent_IE); 
+0

Jest to jedyny cel tej aplikacji, który musi zastąpić pole agenta użytkownika, aby wyświetlić aplikację back office. "Więcej informacji na temat tła, aby uzyskać cuchnącą aplikację backoffice dostępną na Droid (lub jakiejkolwiek innej platformie z wyjątkiem okien), musiałem oszukać aplikację bakcoffice, aby uwierzyć w to, co uzyskuje dostęp do strony internetowej to Internet Explorer. Robię to, modyfikując użytkownika WebView Agent." – JustinKaz

+0

Więc co mówisz, ponieważ modyfikuję User Agent, wpływa to na sposób wyświetlania Javascript? Wątpliwe, pamiętaj, że używam firebug jako testu, backoffice ma setki funkcji JavaScript, które nie są w ogóle ładowane. Firebug był rzeczą, którą muszę przetestować, nie dając ludziom dostępu do systemu backoffice. W końcu potrzebuję sposobu na przesłonięcie pola UserAgent i nadal mam dostęp do pełnej funkcjonalności JavaScript. – JustinKaz

+2

FireBug analizuje agent użytkownika i zachowuje się odpowiednio.Jeśli mówisz, że IE FireBug robi pewne rzeczy w specyficzny dla IE sposób, który nie działa dla Android WebView. Możesz to zobaczyć sam - jeśli usuniesz fałszywego użytkownika-agenta, FireBug zrobi te rzeczy domyślnie, a zobaczysz ikonę. Obawiam się więc, że będziesz musiał przeanalizować swoje skrypty i znaleźć te rzeczy, które robią w specyficzny dla IE sposób. – Fedor

Powiązane problemy