1

我知道这里有很多关于阅读本地HTML文件的问题,但我还没有找到任何满足我需求的问题。Android:如何从TextView链接本地HTML文件

我想弹出一个DialogFragment,显示带有链接的消息,单击该链接并读取本地HTML文件(最好从默认Web浏览器)。

我有什么至今:

@Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity()); 
     alertDialogBuilder.setMessage(Html.fromHtml("I have read and agree to the " + "<a href=\"file:///android_asset/privacy.html\">Terms and Conditions</a>" + " and the " + "<a href=\"http://www.samsung.com/global/business/mobile/info/privacy.html\">Privacy Policy</a>")); 
     alertDialogBuilder.setCancelable(false); 

     //rest of code... 
    } 

指向在线版本的作品像一个魅力的第二个链接。第一个链接应指向我的资产文件夹中的本地privacy.html文件。当点击第一个链接时,发生错误:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///android_asset/privacy.html (has extras) } 

任何人有任何关于这种情况的提示/建议?我试过了多个不同的HTML文件,所有结果都一样。我将不得不使用我自己的WebView来做这样的事情吗?似乎应该有一种方法来要求Android在点击链接时从默认浏览器查看本地HTML文件...

+0

因为最后期限,我不得不破解的对话框表明将触发全屏的WebView按钮(刚才的按钮似乎是链接)。仍然想知道这是否可以完成(根据samsad的评论,我在想“不”)。其他人得到类似的工作? – welshk91 2014-11-05 20:09:21

回答

2

从技术上讲,它不会工作,因为链接是html标记。它将在webview中工作。还是你想的TextView你有自定义代码 试试这个代码来做到这一点:

public class CustomLinkMovementMethod extends LinkMovementMethod 
{ 

private static Context movementContext; 

private static CustomLinkMovementMethod linkMovementMethod = new CustomLinkMovementMethod(); 

public boolean onTouchEvent(android.widget.TextView widget, android.text.Spannable buffer, android.view.MotionEvent event) 
{ 
    int action = event.getAction(); 

    if (action == MotionEvent.ACTION_UP) 
    { 
     int x = (int) event.getX(); 
     int y = (int) event.getY(); 

     x -= widget.getTotalPaddingLeft(); 
     y -= widget.getTotalPaddingTop(); 

     x += widget.getScrollX(); 
     y += widget.getScrollY(); 

     Layout layout = widget.getLayout(); 
     int line = layout.getLineForVertical(y); 
     int off = layout.getOffsetForHorizontal(line, x); 

     URLSpan[] link = buffer.getSpans(off, off, URLSpan.class); 
     if (link.length != 0) 
     { 
      String url = link[0].getURL(); 
      if (url.startsWith("https")) 
      { 
       Log.d("Link", url); 
       Toast.makeText(movementContext, "Link was clicked", Toast.LENGTH_LONG).show(); 
      } else if (url.startsWith("tel")) 
      { 
       Log.d("Link", url); 
       Toast.makeText(movementContext, "Tel was clicked", Toast.LENGTH_LONG).show(); 
      } else if (url.startsWith("mailto")) 
      { 
       Log.d("Link", url); 
       Toast.makeText(movementContext, "Mail link was clicked", Toast.LENGTH_LONG).show(); 
      } 
      return true; 
     } 
    } 

    return super.onTouchEvent(widget, buffer, event); 
} 

public static android.text.method.MovementMethod getInstance(Context c) 
{ 
    movementContext = c; 
    return linkMovementMethod; 
} 

这应该从以下方式TextView的被称为:

textViewObject.setMovementMethod(CustomLinkMovementMethod.getInstance(context)); 
1
myTextView.setText(Html.fromHtml(readTxt())); 

//这函数将返回你可以在你的textview中设置的字符串。而该字符串有HTML代码,这样使用Html.fromHtml

private String readTxt(){ 
InputStream inputStream = getResources().openRawResource(R.raw.My_html_file); 
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
int i; 
try { 
i = inputStream.read(); 
    while (i != -1) 
    { 
    byteArrayOutputStream.write(i); 
    i = inputStream.read(); 
    } 
    inputStream.close(); 
    } catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
    return byteArrayOutputStream.toString(); 
} 
} 

这一块已经是answered

+0

这似乎把HTML文件的内容放在TextView中。我想实现的是TextView中的一个链接,它在点击时打开本地HTML。 – welshk91 2014-10-31 17:36:48