Страница 1 из 1

NullPointerException

Добавлено: 05 авг 2015, 19:25
Perfomer
В общем, пишу класс-обёртку для TextView, который ставил бы мне сразу шрифты (Typeface) на вьюшки.
Переделал немножко смысл определения переменных TextView, было так:

Код: Выделить всё

TextView myTV = (TextView) findViewById(R.id.myTV);
Теперь это выглядит так:

Код: Выделить всё

TextView myTV = fontManager.getTextView(R.id.myTV, 3, false); //3 - id шрифта, false - все не капсом)
Вот метод getTextView:

Код: Выделить всё

public TextView getTextView(int resId, int fontId, boolean allCaps) {
        TextView textView = (TextView) findViewById(resId);
        Typeface font = getFont(fontId);
        if (font != null) textView.setTypeface(font);
        textView.setAllCaps(allCaps);
        return textView;
    }
В нём ошибка на этой строчке textView.setAllCaps(allCaps);
Выдаёт NullPointerException на переменной textView (хотя несколькими строчками выше я её определяю!)
Что делать с эксепшнеом? Как сделать, чтобы работало?

Re: NullPointerException

Добавлено: 05 авг 2015, 19:29
Mikhail_dev
Покажите метод onCreate

Re: NullPointerException

Добавлено: 05 авг 2015, 19:50
Perfomer

Код: Выделить всё

@Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mWFontManager = new WelloFontManager(this);
         setContentView(R.layout.activity_menu);
         TextView mTVExit = mWFontManager.getTextView(R.id.layout_menu_button_exit, 3, true);
}

Re: NullPointerException

Добавлено: 05 авг 2015, 22:27
Mikhail_dev
Откуда WelloFontManager получает ссылку на контекст? Он вызывает метод findViewById у неизвестного объекта активности. Где вы этот менеджер держите?

Re: NullPointerException

Добавлено: 06 авг 2015, 08:55
Perfomer
WelloFontManager получает ссылку на контекст в конструкторе:

Код: Выделить всё

public WelloFontManager(Context context) {
        super(context);
        wfmContext = context; //нигде не используется
        wtvFontEnemyName = Typeface.createFromAsset(context.getAssets(), "fonts/ft_enemy_name.ttf");
        wtvFontMainRegular = Typeface.createFromAsset(context.getAssets(), "fonts/ft_main_regular.ttf");
        wtvFontMainBold = Typeface.createFromAsset(context.getAssets(), "fonts/ft_main_bold.ttf");
    }
Может, как-то методу findViewById сообщить контекст? Только как?

Re: NullPointerException

Добавлено: 06 авг 2015, 08:55
Perfomer
WelloFontManager получает ссылку на контекст в конструкторе:

Код: Выделить всё

public WelloFontManager(Context context) {
        super(context);
        wfmContext = context; //нигде не используется
        wtvFontEnemyName = Typeface.createFromAsset(context.getAssets(), "fonts/ft_enemy_name.ttf");
        wtvFontMainRegular = Typeface.createFromAsset(context.getAssets(), "fonts/ft_main_regular.ttf");
        wtvFontMainBold = Typeface.createFromAsset(context.getAssets(), "fonts/ft_main_bold.ttf");
    }
Может, как-то методу findViewById сообщить контекст? Только как?

Re: NullPointerException

Добавлено: 06 авг 2015, 09:43
Mikhail_dev
Нет, вы не поняли. Я хочу узнать где находится этот самый менеджер? В классе какой-то активности? Ибо как он вызывает метод findViewById . getFont кстати у вас тоже null возвращает.

Re: NullPointerException

Добавлено: 06 авг 2015, 10:04
Perfomer
Класс менеджера в отдельном файле *.java и наследуется от TextView. Объект класса WelloFontManager mFontManager, через который я пытаюсь инициализировать текствьюшки, находится в MainActivity.
Вызов метода findViewById не вызывает нареканий у компилятора, потому что этот метод принадлежит классу View (а вызов этого метода происходит из WelloFontManager, который унаследован от TextView).
p.s про getFont знаю, он ещё не настроен.

Re: NullPointerException

Добавлено: 06 авг 2015, 10:44
Mikhail_dev
Класс менеджера в отдельном файле *.java и наследуется от TextView.
Вы по сути у этого TextView пытаетесь найти внутри него другие элементы, а именно искомый TextView. Попробуйте для примера передать рутовую вьюшку в метод getTextView (вроде так делается - getWindow().getDecorView().findViewById(android.R.id.content) ), и у этой вьюшки найти искомый resId. Если отработает нормально, то значит я тут прав.

Re: NullPointerException

Добавлено: 06 авг 2015, 12:02
Dark67
Можно передавать Activity в конструктор (не Context, а именно Activity)

Re: NullPointerException

Добавлено: 07 авг 2015, 05:40
Perfomer
Спасибо за помощь, ребят. Идея с передачей Activity в конструктор, а потом вызов метода findViewById через эту активити сработали.