2

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

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; 

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

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

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

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

EDIT: Только что попробовал ((TextView) v.getRootView().findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance()); и ((TextView) v.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance()); в onCreateView(), а также пытались в onCreateDialog() без успеха.
все еще получает исключение нулевого указателя ...

ответ

8

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

@Override 
public void onStart() { 
    super.onStart(); 
    ((TextView) getDialog().findViewById(android.R.id.message)) 
      .setMovementMethod(LinkMovementMethod.getInstance()); 
} 
1

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

Это мое подозрение. Есть ли какая-то причина, по которой вы не можете сделать свою «ссылку на клики» внутри своего метода onCreateDialog()?

+0

См. Мое редактирование. Я пробовал как в onCreateDialog(), так и в onCreateView() после вызова View v = super.onCreateView (...), и это не сработало! – Kavi

Смежные вопросы