尝试在空对象引用上调用虚方法’java.lang.String android.content.Context.getPackageName()’

尝试在空对象引用上调用虚方法’java.lang.String android.content.Context.getPackageName()’,第1张

概述我有一个Activity,它本身有三个片段.在其中一个片段中,有一个带有自定义适配器的RecyclerView,并且单击其中一个项目将转到另一个页面,这是同一个Activity的新实例.但是,某种行为会导致我的应用出错.在我的Activity中,单击其中一个项会显示同一个Activity的新实例,这很好.然后我

我有一个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()’所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1115036.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存