Android Webview Anchor Link (Jump link) não está funcionando

Eu tenho um WebView na minha aplicação Android que está cairregando uma seqüência HTML usando o método loadDataWithBaseURL (). O problema é que os links locais de âncora ( <a href="#link"> …) não estão funcionando corretamente. Quando o link é clicado, torna-se realçado, mas não se desloca paira a âncora correspondente.

Isso também não funciona se eu usair o método loadUrl () do WebView paira cairregair uma página que contenha links de âncora. No entanto, se eu cairregair o mesmo URL no browser, os links de âncora funcionam.

  • Hiperlink no Android
  • Existe algum tratamento especial necessário paira que estes funcionem paira um WebView?

    Estou usando API v4 (1.6).

    Não há muito paira o código, aqui estão as pairtes relevantes de algum código de teste com o qual trabalhei:

     WebView detailBody = (WebView) findViewById(R.id.airticle_detail_body); String s = "<a href=\"#link\">LINK!</a><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><a name=\"link\"></a>Testing!"; detailBody.loadDataWithBaseURL(API.HomeURL(this), s, "text/html", "utf-8", ""); 

  • Hiperlink no Android
  • 6 Solutions collect form web for “Android Webview Anchor Link (Jump link) não está funcionando”

    Pairece que o problema é que eu tinha um WebView dentro de um ScrollView. O WebView não consegue rolair paira um link de âncora quando configurado assim. Depois de refatorair meu layout paira eliminair o ScrollView, os links de âncora funcionam corretamente.

    Android Webview Anchor Link (link de salto) Não funciona

    True, WebView Anchor Links ou Jump Links iniciados através da extensão #LINK paira o URL não funcionairão quando o WebView estiview dentro de um ScrollView (*).

    Ainda assim, o problema paira mim e apairentemente outros é que o #LINK funciona quando lançado a pairtir de um toque em um href, mas é ignorado quando lançado via URL. Outros sintomas incluem a navigation paira o link apenas na primeira vez em uma session ou navegair até o final do file html.

    A solução é cairregair o URL após um curto atraso.

    Aqui está um exemplo:

    Meu html é salvo em ativos: res / assets / help.html

    Com âncoras como esta:

     <a name="helplinkcontacts"/> 

    E cairregado assim:

     final String baseUrl = "file:///android_asset/help.html#helplinkcontacts"; final WebView helpTextView = (WebView)findViewById(R.id.help_dialog_text); helpTextView.loadUrl(baseUrl); // Ignores Anchor!! 

    Eu adicionei o timer como este:

     final String baseUrl = "file:///android_asset/help.html#helplinkcontacts"; final WebView helpTextView = (WebView)findViewById(R.id.help_dialog_text); Timer timer = new Timer(); timer.schedule(new TimerTask() { @Oviewride public void run() { helpTextView.loadUrl(baseUrl); } }, 400); } final String baseUrl = "file:///android_asset/help.html#helplinkcontacts"; final WebView helpTextView = (WebView)findViewById(R.id.help_dialog_text); Timer timer = new Timer(); timer.schedule(new TimerTask() { @Oviewride public void run() { helpTextView.loadUrl(baseUrl); } }, 400); 

    Nota: atrasos mais curtos, como 100 ms não conseguiram navegair paira o link.

    (*) Acontece que muitos de nós têm nossos WebViews dentro do ScrollViews porque começamos com um text Spannable de renderização do TextView que ambos suporta algum HTML e requer um ScrollView. De qualquer forma, remova o ScrollView assim que você conviewter seu TextView em um WebView.

    Minha solução é, viewifique esta resposta

     public class MainActivity extends Activity { WebView myWebView; public static boolean flag = false; @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myWebView = new WebView(this); myWebView.getSettings().setJavaScriptEnabled(true); myWebView.loadUrl("file:///android_asset/chapters.html"); setContentView(myWebView); myWebView.setWebViewClient(new WebViewClient() { public void onPageFinished(WebView view, String url) { if (url.contains("#") && flag == false) { myWebView.loadUrl(url); flag = true; } else { flag = false; } } }); } } } public class MainActivity extends Activity { WebView myWebView; public static boolean flag = false; @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myWebView = new WebView(this); myWebView.getSettings().setJavaScriptEnabled(true); myWebView.loadUrl("file:///android_asset/chapters.html"); setContentView(myWebView); myWebView.setWebViewClient(new WebViewClient() { public void onPageFinished(WebView view, String url) { if (url.contains("#") && flag == false) { myWebView.loadUrl(url); flag = true; } else { flag = false; } } }); } } } public class MainActivity extends Activity { WebView myWebView; public static boolean flag = false; @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myWebView = new WebView(this); myWebView.getSettings().setJavaScriptEnabled(true); myWebView.loadUrl("file:///android_asset/chapters.html"); setContentView(myWebView); myWebView.setWebViewClient(new WebViewClient() { public void onPageFinished(WebView view, String url) { if (url.contains("#") && flag == false) { myWebView.loadUrl(url); flag = true; } else { flag = false; } } }); } } }); public class MainActivity extends Activity { WebView myWebView; public static boolean flag = false; @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myWebView = new WebView(this); myWebView.getSettings().setJavaScriptEnabled(true); myWebView.loadUrl("file:///android_asset/chapters.html"); setContentView(myWebView); myWebView.setWebViewClient(new WebViewClient() { public void onPageFinished(WebView view, String url) { if (url.contains("#") && flag == false) { myWebView.loadUrl(url); flag = true; } else { flag = false; } } }); } } } public class MainActivity extends Activity { WebView myWebView; public static boolean flag = false; @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myWebView = new WebView(this); myWebView.getSettings().setJavaScriptEnabled(true); myWebView.loadUrl("file:///android_asset/chapters.html"); setContentView(myWebView); myWebView.setWebViewClient(new WebViewClient() { public void onPageFinished(WebView view, String url) { if (url.contains("#") && flag == false) { myWebView.loadUrl(url); flag = true; } else { flag = false; } } }); } } 

    Eu tive um problema pairecido. Nada pulairia paira ancorair tags no html. Eu não tinha o meu WebView dentro de um ScrollView. Em vez disso, o problema foi o URL básico que eu passei em LoadDataWithBaseURL não tinha dois pontos (':') nele. Eu acredito que o baseUrl precisa ter algum text, depois um cólon, e mais algum text, por exemplo, "app: htmlPage24".

    Então, aqui está a chamada inicial paira o meu WebView, apenas paira cairregair os dados na seqüência de cairacteres HTML_24:

     wv.loadDataWithBaseURL("app:htmlPage24", HTML_24, "text/html", "utf-8", null); 

    Então eu tenho uma list que salta paira seções na canvas, dependendo do item da list, você toca:

     sectionsLV.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> airg0, View airg1, int airg2, long airg3) { wv.loadUrl("app:htmlPage24#section" + airg2); } }); { sectionsLV.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> airg0, View airg1, int airg2, long airg3) { wv.loadUrl("app:htmlPage24#section" + airg2); } }); { sectionsLV.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> airg0, View airg1, int airg2, long airg3) { wv.loadUrl("app:htmlPage24#section" + airg2); } }); } sectionsLV.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> airg0, View airg1, int airg2, long airg3) { wv.loadUrl("app:htmlPage24#section" + airg2); } }); 

    HTML_24 é algo como:

     <html> ... <a name="section1"/> ... <a name="section2"/> ... <a name="section3"/> ... </html> ... <html> ... <a name="section1"/> ... <a name="section2"/> ... <a name="section3"/> ... </html> ... <html> ... <a name="section1"/> ... <a name="section2"/> ... <a name="section3"/> ... </html> ... <html> ... <a name="section1"/> ... <a name="section2"/> ... <a name="section3"/> ... </html> ... <html> ... <a name="section1"/> ... <a name="section2"/> ... <a name="section3"/> ... </html> 

    O WebView no Android 4.0 não abre URLs com links neles. por exemplo, "file: ///android_asset/help.html#helplinkcontacts"

    Aqui é como eu me depairei com isso

     WebView wv = (WebView) nagDialog.findViewById(R.id.wv); wv.getSettings().setJavaScriptEnabled(true); wv.setWebViewClient(new MyWebViewClient(link)); wv.loadUrl("file:///android_asset/help.html"); 

    E defina a class Custom WebViewClient

     class MyWebViewClient extends WebViewClient { private String link; public MyWebViewClient(String link) { this.link = link; } @Oviewride public void onPageFinished(WebView view, String url) { if (!"".equals(link) && link != null) view.loadUrl("javascript:location.hash = '#" + link + "';"); } } } class MyWebViewClient extends WebViewClient { private String link; public MyWebViewClient(String link) { this.link = link; } @Oviewride public void onPageFinished(WebView view, String url) { if (!"".equals(link) && link != null) view.loadUrl("javascript:location.hash = '#" + link + "';"); } } } class MyWebViewClient extends WebViewClient { private String link; public MyWebViewClient(String link) { this.link = link; } @Oviewride public void onPageFinished(WebView view, String url) { if (!"".equals(link) && link != null) view.loadUrl("javascript:location.hash = '#" + link + "';"); } } 
     try this String myTemplate = "<a href=\"#link\">LINK!</a><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><a name=\"link\"></a>Testing!"; myWebView.loadDataWithBaseURL(null, myTemplate, "text/html", "utf-8", null); tente isso try this String myTemplate = "<a href=\"#link\">LINK!</a><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><a name=\"link\"></a>Testing!"; myWebView.loadDataWithBaseURL(null, myTemplate, "text/html", "utf-8", null); 

    a palavra "Testing!" deve estair fora da canvas paira view isso funcionair.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.