2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > android 字符串调用方法名 尝试在空对象引用上调用虚拟方法'java.lang.String and

android 字符串调用方法名 尝试在空对象引用上调用虚拟方法'java.lang.String and

时间:2024-07-08 10:55:43

相关推荐

android 字符串调用方法名 尝试在空对象引用上调用虚拟方法'java.lang.String and

在其中一个片段中,有一个RecyclerView带有自定义适配器,并且单击其中一个项目将转到另一个页面,该页面是相同Activity的新实例。但是,某些行为会在我的应用程序中导致错误。

从我的活动中,点击其中一个项目可以调出相同Activity的新实例,这很好。然后我按下后退按钮,然后回到第一个活动。但是,再次点击这些项目之一(启动同一活动的新实例)导致以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference

同样重要的是要考虑到我打电话了活动的新实例(即其中这三个项目是),我在我的活动中的一个片段。所以,当我打电话吧,我有这样的:

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 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 {

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 mArray;

public MyRVAdapter(Context context, ArrayList 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: main

Process: com.mycompany.myapp, PID: 388

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference

at ponentName.(ComponentName.java:77)

at android.content.Intent.(Intent.java:4570)

at com.mycompany.myapp.MyActivity$MyFragment$1.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。

+2

'getActivity()'可能返回null。你在哪里设置你的'OnClickListener'? –

+0

请添加java代码并且 - 没必要 - 问题出现在代码中 –

+0

它几乎听起来像您使用的是相同的Fragment,但带有一个新的Activity,因此当它获取Activity引用时,它不再存在。你是否在使用保留的片段,或者你是否将片段引用传递给活动的新实例?我们可能需要查看一些代码才能了解这一点。 –

android 字符串调用方法名 尝试在空对象引用上调用虚拟方法java.lang.String android.content.Context.getPackageName...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。