getBaseContext()上的NullPointerException

时间:2016-01-28 19:46:41

标签: java android nullpointerexception android-context

我有一个MainActivity类,其中有一个名为updateTabTitles();

的方法

updateTabTitles()执行听起来的操作,更新标签的标题。

    String tabName = tabNames[tabNumber];
    String font = "helveticaneuebold.ttf"; // Fonts found in assets/fonts/ folder

    SpannableString title = new SpannableString(tabName);
    SpannableString subTitle;

    // This line gives me trouble
    title.setSpan(new TypefaceSpan(getBaseContext(), font), 0, title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

我从扩展ChecklistTab类的Fragment类中调用此函数。以下方法在我的ChecklistTab类中:

 public int calculateRemaining(ArrayList<ChecklistItem> checklistItems, int tabNumber) {
    int remaining = 0;

    for (int i = 0; i < checklistItems.size(); i++) {
        if (!checklistItems.get(i).getCheckBox().isChecked() && checklistItems.get(i).getCheckBox().isEnabled() && !checklistItems.get(i).getCheckBox().getText().equals("N/A")) {
            remaining++;
        }
    }

    // NULL POINTER HERE
    ((MainActivity) getActivity()).updateTabTitles(tabNumber, remaining);

    return remaining;
}

最后,我在网上找到了一个用于更改字体的自定义TypefaceSpan课程。这是从updateTabTitles()

调用的构造函数
public TypefaceSpan(Context context, String typefaceName) {
    mTypeface = sTypefaceCache.get(typefaceName);

    if (mTypeface == null) {
        mTypeface = Typeface.createFromAsset(context.getApplicationContext()
                .getAssets(), String.format("fonts/%s", typefaceName));

        // Cache the loaded Typeface
        sTypefaceCache.put(typefaceName, mTypeface);
    }
}

我真的不太了解上下文,但这段代码过去常用于我的旧实现。但是,自重构以来,我似乎无法弄清楚现在的错误。

堆栈跟踪:

java.lang.NullPointerException
            at com.brettrosen.atls.fragments.ChecklistTab.calculateRemaining(ChecklistTab.java:179)
            at com.brettrosen.atls.onclicklisteners.CheckboxOnClickListener.onClick(CheckboxOnClickListener.java:46)
            at android.view.View.performClick(View.java:4192)
            at android.widget.CompoundButton.performClick(CompoundButton.java:100)
            at android.view.View$PerformClick.run(View.java:17327)
            at android.os.Handler.handleCallback(Handler.java:725)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5019)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)

3 个答案:

答案 0 :(得分:0)

您可以尝试getApplicationContext而不是getBaseContext

title.setSpan(new TypefaceSpan(getApplicationContext(), font), 0, title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

答案 1 :(得分:0)

尝试使用

title.setSpan(new TypefaceSpan(this, font), 0, title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

答案 2 :(得分:0)

stacktrace说PrearrivalPlan是你的片段,因为它正在调用onCreateView()。但是,您在getActivity()中调用了ChecklistTab,这似乎是另一个片段,并且它没有附加到任何活动。 getActivity()返回null,因此返回您看到的不同NPE。

您可以将Context作为参数传递给那些需要一个的方法,并且只在片段中的getActivity()onAttach()生命周期事件之间的片段中使用onDetach()的生命周期。