Интерактивные гиперссылки в DialogFragment

Это мой статический внутренний класс для создания AlertDialog внутри моего класса MainActivity:

public static class AboutDialogFragment extends DialogFragment {

    public static AboutDialogFragment newInstance() {
        AboutDialogFragment frag = new AboutDialogFragment();
        return frag;
    }  

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        return new AlertDialog.Builder(getActivity())
                .setIcon(R.drawable.ic_dialog_about)
                .setTitle(R.string.about)
                .setMessage(R.string.about_message)
                ..........
                .create();
    }
}

И я показываю это, когда вы нажимаете пункт меню внутри MainActivity:

case R.id.about:
        DialogFragment aboutFragment = AboutDialogFragment.newInstance();
        aboutFragment.show(getSupportFragmentManager(), "about_dialog");
        // Make links clickable
        ((TextView) aboutFragment.getDialog().findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
        return true;

Я пытаюсь сделать ссылки в тексте сообщения интерактивными, используя прокомментированную строку.

Я нашел этот метод здесь, и он работал у меня при использовании обычного диалогового окна (нет фрагменты).
Однако я впервые пробовал использовать его в DialogFragment и всегда получаю исключение NullPointerException при попытке найти представление.

Я также пробовал aboutFragment.getView().findViewById(android.R.id.message), но он тоже возвращает null.

Может быть, я вызываю код слишком рано / не в том месте?
Любые идеи были бы отличными!

РЕДАКТИРОВАТЬ: только что попробовал ((TextView) v.getRootView().findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance()); и ((TextView) v.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance()); в onCreateView (), а также безуспешно пытался в onCreateDialog ().
Все еще получаю исключение нулевого указателя ...


person Kavi    schedule 04.02.2012    source источник


Ответы (3)


Надеюсь, вы уже поняли это, но я проделал то же самое и хотел где-то это задокументировать. Поместите это в свой DialogFragment класс:

@Override
public void onStart() {
    super.onStart();
    ((TextView) getDialog().findViewById(android.R.id.message))
            .setMovementMethod(LinkMovementMethod.getInstance());
}
person Christopher    schedule 18.06.2012
comment
Ты спас мне день! - person Oleksandr Nos; 12.04.2018

Может я слишком рано / не туда набираю код?

Это мое подозрение. Есть ли причина, по которой вы не можете сделать "ссылки кликабельными" внутри вашего onCreateDialog() метода?

person Brian Dupuis    schedule 04.02.2012
comment
Смотрите мою правку. Я пробовал как onCreateDialog (), так и onCreateView () после вызова View v = super.onCreateView (...), и это не сработало! - person Kavi; 04.02.2012

Со временем добавлялись некоторые обновленные входные данные в запрос.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    setupView(view)
}    

private fun setupView(view: View) {
        toolbar.setNavigationOnClickListener({ v -> dismiss() })
        toolbar.title = "New Message"
        view.tvTitle.text = arguments?.getString("title")
        view.tvBody.autoLinkMask = Linkify.ALL
        view.tvBody.text = arguments?.getString("body")
        view.tvBody.movementMethod = LinkMovementMethod.getInstance()
    }

Наиболее важные 2 шага в приведенном выше коде (которые можно использовать в любых текстовых представлениях диалоговых окон):

  1. Чтобы связать
  2. setMovementMethod

После этого все ссылки будут работать нормально.

person PPing    schedule 11.07.2021