Java 尝试在空对象引用上调用虚方法-片段
我正在尝试编写一个方法,将数据从片段发送到Android Studio中的另一个片段。我已经创建了这个方法的示例应用程序。它工作得很好 我只是复制了与示例应用程序中完全相同的每个方法和接口,并创建了一个新的片段类(与示例中的相同) sendData工作正常,但sendDataLatLon崩溃-我收到一条消息Java 尝试在空对象引用上调用虚方法-片段,java,android,android-fragments,Java,Android,Android Fragments,我正在尝试编写一个方法,将数据从片段发送到Android Studio中的另一个片段。我已经创建了这个方法的示例应用程序。它工作得很好 我只是复制了与示例应用程序中完全相同的每个方法和接口,并创建了一个新的片段类(与示例中的相同) sendData工作正常,但sendDataLatLon崩溃-我收到一条消息 java.lang.NullPointerException: Attempt to invoke virtual method 'void com.journaldev.passing
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.journaldev.passingdatabetweenfragments.FragmentThree.displayReceivedDataLanLon(java.lang.String)' on a null object reference
at com.journaldev.passingdatabetweenfragments.MainActivity.sendDataLatLon(MainActivity.java:38)
at com.journaldev.passingdatabetweenfragments.FragmentOne$1.onClick(FragmentOne.java:87)
现在在FragmentOne中-我正在使用按钮-一切正常
bttnPass.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
SM.sendData(inDataLat.toString().trim() + ";" + inDataLon.toString().trim());
}
});
在同一个片段中,当我使用另一个按钮(同上)时,在SLL.sendData行中有一个错误,您可以在上面的logcat中看到
下面是我编写的其余代码
interface SendMessage {
void sendData(String message);
}
interface SendMessageLanLon {
void sendDataLatLon(String message);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
SM = (SendMessage) getActivity();
SLL = (SendMessageLanLon) getActivity();
} catch (ClassCastException e) {
throw new ClassCastException("Error in retrieving data. Please try again");
}
}
现在,参考一个日志,我不知道为什么一个对象是空的。我发送的消息不是null,并且方法与工作消息相同
我的方法中的标记值是否有问题?
这是ViewPagerAdapter:
public class ViewPagerAdapter extends FragmentPagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
if (position == 0) {
fragment = new FragmentOne();
} else if (position == 1) {
fragment = new FragmentTwo();
} else if (position == 2) {
fragment = new FragmentThree();
}
return fragment;
}
或者我可以用同样的方法将值传递给另一个片段,但我不知道如何传递。我刚开始学安卓。试图了解它是如何工作的:/
FragmentThree f = (FragmentThree) getSupportFragmentManager().findFragmentByTag(tag);
这将返回
Null
,因为FragmentThree在活动中没有膨胀。当我们使用ViewPager
时,只有上一个和下一个片段
膨胀,而不是全部片段使用此代码来解决此问题
活跃
@凌驾
公共void sendDataLatLon(字符串消息){
String tag=“android:switcher:”+R.id.viewPager+”:“+2;
viewPagerAdapter.sendData(消息);
}
在ViewPagerAdapter类中
字符串消息=”
支离破碎
字符串message1=“”
还有@woodvi什么?为什么要写它?日志上说这行“FragmentThree f=(FragmentThree)getSupportFragmentManager().findFragmentByTag(tag);”返回null。碎片管理器找不到你的碎片,这可能意味着它还没有被连接。@andrewoid那么我应该在哪里或者怎样做?碎片页面管理员对此负责。更新适配器片段的内容有些棘手,有几种方法可以做到这一点。如果在按下此按钮之前滚动到其他片段,是否会发生此崩溃?如果是这样的话,那么我不明白发生了什么,因为所有的片段都应该在那之前连接好,我想你能格式化它吗,因为我不完全明白。。。我不能做:fragment-newfragmentthree(message)-在ViewPageAdapter中,请创建FragmentThree构造函数并传递字符串文件。这很简单我应该在哪里创建它?在FragmentOne中-从我发送字符串的位置或在FragmentThree中接收字符串的位置?我想您没有检查我的代码。请将消息字符串传递到适配器类中,然后您可以将消息字符串发送到FragmentThree类中。如下所示..fragment=新的FragmentThree(消息);
FragmentThree f = (FragmentThree) getSupportFragmentManager().findFragmentByTag(tag);
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
if (position == 0) {
fragment = new FragmentOne();
} else if (position == 1) {
fragment = new FragmentTwo();
} else if (position == 2) {
fragment = new FragmentThree(message);
}
return fragment;
}
@Override
public int getCount() {
return 3;
}
public void sendData(String message) {
this.message = message;
}
public FragmentThree(String message1) {
this.message1 = message1;
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.fragment_fragment_three, container, false);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
fragThreeTv = (TextView) view.findViewById(R.id.fragThreeTv);
fragThreeTv.setText(message1);
}