
我有一个Activity,它本身有三个片段.
在其中一个片段中,有一个带有自定义适配器的RecyclerVIEw,并且单击其中一个项目将转到另一个页面,这是同一个Activity的新实例.但是,某种行为会导致我的应用出错.
在我的Activity中,单击其中一个项会显示同一个Activity的新实例,这很好.然后我按下后退按钮,我被带回第一个活动.但是再次单击其中一个项目(以启动相同Activity的新实例)会导致以下错误:
java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.String androID.content.Context.getPackagename()’ on a null object reference
同样重要的是要考虑我在我的Activity中的一个片段中调用Activity的新实例(即三个项目的位置).所以,当我打电话给它时,我有类似的东西:
public class MyActivity extends AppCompatActivity { ... @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... VIEwPager vIEwPager = (VIEwPager) findVIEwByID(R.ID.detail_vIEwpager); vIEwPager.setAdapter(new VIEwPagerAdapter(getSupportFragmentManager())); TabLayout tabLayout = (TabLayout) findVIEwByID(R.ID.detail_tabs); tabLayout.setTabTextcolors( ContextCompat.getcolor(this, R.color.text_white_secondary), ContextCompat.getcolor(this, R.color.text_white)); tabLayout.setSelectedTabIndicatorcolor(ContextCompat.getcolor(this, R.color.white)); tabLayout.setupWithVIEwPager(vIEwPager); vIEwPager.addOnPagechangelistener(new TabLayout.TabLayoutOnPagechangelistener(tabLayout)); } ... public class VIEwPagerAdapter extends FragmentPagerAdapter { public VIEwPagerAdapter(FragmentManager fm) { super(fm); } @OverrIDe public int getCount() { return 3; } @OverrIDe public Fragment getItem(int position) { switch (position) { case 0: return new MainFragment(); case 1: return new MyFragment(); case 2: return new MyOtherFragment(); } return null; } @OverrIDe public CharSequence getPageTitle(int position) { Locale l = Locale.getDefault(); switch (position) { case 0: return getString(R.string.tab_main_frag).toupperCase(l); case 1: return getString(R.string.tab_my_frag).toupperCase(l); case 2: return getString(R.string.tab_my_other_frag).toupperCase(l); } return null; } } ... public static class MyFragment extends Fragment implements MyRVAdapter.OnEntryClickListener { ... private ArrayList<ItemObj> mArrayList; @OverrIDe public VIEw onCreateVIEw(LayoutInflater inflater, VIEwGroup container, Bundle savedInstanceState) { ... doStuff(); ... } private voID doStuff() { ... mArrayList = ...; MyRVAdapter adapter = new MyRVAdapter(getActivity(), mArrayList); adapter.setonEntryClickListener(new MyRVAdapter.OnEntryClickListener() { @OverrIDe public voID onEntryClick(VIEw vIEw, int position) { Intent intent = new Intent(getActivity(), MyActivity.class); intent.putExtra("informatION", mArrayList.get(position)); startActivity(intent); } }); } ... } ...}这是我的自定义适配器的一部分:
public class MyRVAdapter extends RecyclerVIEw.Adapter<MyRVAdapter.MyVIEwHolder> { public static class MyVIEwHolder extends RecyclerVIEw.VIEwHolder implements VIEw.OnClickListener { ... MyVIEwHolder(VIEw itemVIEw) { super(itemVIEw); itemVIEw.setonClickListener(this); ... } @OverrIDe public voID onClick(VIEw v) { // The user may not set a click Listener for List items, in which case our Listener // will be null, so we need to check for this if (mOnEntryClickListener != null) { mOnEntryClickListener.onEntryClick(v, getLayoutposition()); } } } private Context mContext; private ArrayList<ItemObj> mArray; public MyRVAdapter(Context context, ArrayList<ItemObj> array) { mContext = context; mArray = array; } @OverrIDe public int getItemCount() { return mArray.size(); } @OverrIDe public MyVIEwHolder onCreateVIEwHolder(VIEwGroup parent, int vIEwType) { VIEw vIEw = LayoutInflater.from(parent.getContext()).inflate(R.layout.tile_simple, parent, false); return new MyVIEwHolder(vIEw); } @OverrIDe public voID onBindVIEwHolder(MyVIEwHolder holder, int position) { ItemObj anItem = mArray.get(position); ... } @OverrIDe public voID onAttachedToRecyclerVIEw(RecyclerVIEw recyclerVIEw) { super.onAttachedToRecyclerVIEw(recyclerVIEw); } private static OnEntryClickListener mOnEntryClickListener; public interface OnEntryClickListener { voID onEntryClick(VIEw vIEw, int position); } public voID setonEntryClickListener(OnEntryClickListener onEntryClickListener) { mOnEntryClickListener = onEntryClickListener; }}这是完整的错误:
01-23 14:07:59.083 388-388/com.mycompany.myapp E/AndroIDRuntime: FATAL EXCEPTION: mainProcess: com.mycompany.myapp, PID: 388java.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:4570) at com.mycompany.myapp.MyActivity$MyFragment.onEntryClick(MyActivity.java:783) at com.mycompany.myapp.adapter.MyRVAdapter$MyVIEwHolder.onClick(MyRVAdapter.java:42) at androID.vIEw.VIEw.performClick(VIEw.java:5197) at androID.vIEw.VIEw$PerformClick.run(VIEw.java:20926) 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:5951) 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:1400) at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:1195)错误指向第一行:Intent intent = new Intent(getActivity(),MyActivity.class); (从片段开始)首先,在(在错误中)指向mOnEntryClickListener.onEntryClick(v,getLayoutposition())的行之后;来自自定义适配器中的重写onClick方法.
我也读过类似的答案,但他们没有解决我的问题.
编辑:
通过使用:
if (getActivity() == null) { Log.d(LOG_TAG, "Activity context is null");} else { Intent intent = new Intent(getActivity(), MyActivity.class); intent.putExtra("informatION", mArrayList.get(position)); startActivity(intent);}在片段的内部类(onEntryClick)中,我发现调用getActivity()会返回null.
解决方法:
所以,问题是这一行
private static OnEntryClickListener mOnEntryClickListener;由于它是静态的,因此在运行时只有一个类的实例.单击某个项目时,将创建同一活动的第二个实例,并创建另一个mOnEntryClickListener实例,覆盖前一个实例.因此,当您按回以返回到Activity的第一个实例时,您正在使用已销毁的第二个Activity的mOnEntryClickListener实例.
总结以上是内存溢出为你收集整理的尝试在空对象引用上调用虚方法’java.lang.String android.content.Context.getPackageName()’全部内容,希望文章能够帮你解决尝试在空对象引用上调用虚方法’java.lang.String android.content.Context.getPackageName()’所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)