Android: как связать локальный файл HTML с TextView

Я знаю, что здесь много вопросов о чтении локальных HTML-файлов, но я не нашел ни одного, который удовлетворял бы мои потребности.

Я хотел бы, чтобы DialogFragment всплывал, показывал сообщение со ссылкой в ​​нем, щелкал по этой ссылке и читал локальный файл HTML (желательно из веб-браузера по умолчанию).

Что у меня есть до сих пор:

    @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 из браузера по умолчанию при нажатии на ссылку...


person welshk91    schedule 31.10.2014    source источник
comment
Из-за крайних сроков мне пришлось взломать диалоговое окно, чтобы показать кнопки, которые запускали бы полноэкранный WebView (только что кнопки выглядели как ссылки). Все еще интересно, можно ли это сделать (я думаю, что нет, согласно комментарию самсада). У кого-нибудь еще что-то подобное работает?   -  person welshk91    schedule 05.11.2014
comment
Здесь я ответил на вопрос того же типа Нажмите здесь для решения   -  person being_sohelkhan    schedule 08.11.2019
comment
Здесь я ответил на вопрос того же типа - Нажмите для решения   -  person being_sohelkhan    schedule 08.11.2019


Ответы (2)


Технически это не сработает, потому что ссылка — это html-тег. Это будет работать в веб-просмотре. Тем не менее вы хотите сделать это с помощью 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;
}

Это должно быть вызвано из текстового представления следующим образом:

textViewObject.setMovementMethod(CustomLinkMovementMethod.getInstance(context));
person samsad    schedule 31.10.2014

myTextView.setText(Html.fromHtml(readTxt())); 

//Эта функция вернет строку, которую вы можете установить в своем текстовом представлении. И у этой строки есть 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();
}
 }

на этот вопрос уже отвечено

person Vivek Shah    schedule 31.10.2014
comment
это, кажется, помещает содержимое файла HTML в TextView. Я пытаюсь добиться ссылки в TextView, которая открывает локальный HTML при нажатии. - person welshk91; 31.10.2014