【问题标题】:Starting an activity from fragment causes NullPointerException从片段启动活动会导致 NullPointerException
【发布时间】:2016-07-16 11:11:23
【问题描述】:

我有一个活动包含带有片段的 ViewPager

MainActivity.java:

public class MainActivity extends AppCompatActivity {
    @BindView(R.id.viewPager) ViewPager viewPager;
    private ViewPagerAdapter pagerAdapter;

    private void initView() {
        pagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(pagerAdapter);
        viewPager.addOnPageChangeListener(pagerAdapter);
    }
}

InfoFragment.Java:

public class InfoFragment extends Fragment implements View.OnClickListener {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_info, container, false);
        ButterKnife.bind(this, root);
        initView();
        return root;
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(getActivity(), ContactActivity.class);
        intent.putParcelableArrayListExtra(MainActivity.CONTACT_LIST, (ArrayList<? extends Parcelable>) contactList);
        startActivityForResult(intent, CONTACT_ACTIVITY);
    }
}

当恰好在这一行执行 onClick 方法时:

Intent intent = new Intent(getActivity(), ContactActivity.class);

出现此异常

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at android.content.ComponentName.<init>(ComponentName.java:77)
at android.content.Intent.<init>(Intent.java:4618)
at com.swazer.smares.ui.fragments.InfoFragment$1.onClick(InfoFragment.java:128)
at android.view.View.performClick(View.java:5217)
at android.view.View$PerformClick.run(View.java:20983)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6117)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

有人知道为什么会这样吗?

【问题讨论】:

  • 您的 MainActivity 中应该有一行带有 android.content.Context.getPackageName() 的行。检查一下。
  • 试试Intent intent = new Intent(v.getContext(), ContactActivity.class);,因为在日志中意味着getActivity()返回null
  • #isnotmenow 我认为 getPackageName() 是在 Context 类中定义的,它不应该出现在我的活动中
  • 您应该使用getApplicationContext()getContext(),而不是使用getActivity()
  • getContext() 也返回null,并且Fragment中不存在getApplicationContext()

标签: java android android-fragments nullpointerexception


【解决方案1】:

尝试以下代码之一:

1)试试这个代码:

Intent i = new Intent(getApplicationContext(), ContactActivity.class);

2) 将此添加到您的 java 文件中:

MainActivity.java..

public static Context cxt;

public class MainActivity extends AppCompatActivity {
    cxt = this;

    @BindView(R.id.viewPager) ViewPager viewPager;
    private ViewPagerAdapter pagerAdapter;

    private void initView() {
        pagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(pagerAdapter);
        viewPager.addOnPageChangeListener(pagerAdapter);
    }
}

InfoFragment.java:

 @Override
    public void onClick(View v) {
        Intent intent = new Intent(MainActivity.cxt, ContactActivity.class);
        intent.putParcelableArrayListExtra(MainActivity.CONTACT_LIST, (ArrayList<? extends Parcelable>) contactList);
        startActivityForResult(intent, CONTACT_ACTIVITY);
    }

【讨论】:

  • 有什么想法 getActivity() 会返回 null 吗?
  • 我认为它返回 null 因为您正在从片段中调用该方法。因此它不会为该方法分配值。你必须有一个值的上下文
  • 我仍在测试所有可能的情况,但我认为 v.getContext() 工作正常
  • 遗憾的是,v.getContext() 在三星 Tab A 上似乎没有任何效果
猜你喜欢
  • 2021-02-18
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多