Java 如何从另一个加载的片段调用一个方法,并在视图页面中对该片段(未显示)进行udapte?

Java 如何从另一个加载的片段调用一个方法,并在视图页面中对该片段(未显示)进行udapte?,java,android,android-fragments,android-viewpager,pageviews,Java,Android,Android Fragments,Android Viewpager,Pageviews,首先,对不起,如果我的英语不是很好 我目前正在为一家小企业编写一个股票管理应用程序。 我目前有一个视图寻呼机(带有一个FragmentStatePagerAdapter)重新组合不同的片段,请注意,由于pager.setOffscreenPageLimit(4),每个未“显示”的片段都已加载到缓存内存中 我希望当我在片段的微调器中选择一个对象时,它也会通过选择该对象然后显示相应的数据来更新另一个片段 我的想法是将对象的等级存储在所有片段(使用getter和setter)共有的主活动中。因此,当在

首先,对不起,如果我的英语不是很好

我目前正在为一家小企业编写一个股票管理应用程序。 我目前有一个视图寻呼机(带有一个
FragmentStatePagerAdapter
)重新组合不同的片段,请注意,由于
pager.setOffscreenPageLimit(4)
,每个未“显示”的片段都已加载到缓存内存中

我希望当我在片段的微调器中选择一个对象时,它也会通过选择该对象然后显示相应的数据来更新另一个片段

我的想法是将对象的等级存储在所有片段(使用getter和setter)共有的主活动中。因此,当在一个微调器中选择一个对象时,我们调用方法
setRank()
updateData()将更新其日期的每个片段的方法感谢getRank()

主要活动:

public int getRankObject(){
返回rankObjectMain;
}
公共无效setRankObject(int newRank){
rankObjectMain=newRank;
}
公共无效开始视图管理器(整数){
tabSwitchAdapter tabSwitchAdapter=新tabSwitchAdapter(getSupportFragmentManager());
如果((!pager.isShown())){
寻呼机设置适配器(tabSwitchAdapter);
寻呼机设置偏移量(4);
tabLayout.setupWithViewPager(寻呼机);
}
Fragment fragment1=tabSwitchAdapter.getItem(1);
((FragmentOne)fragment1.update();
Fragment fragment2=tabSwitchAdapter.getItem(2);
((FragmentTwo)fragment2.update();
Fragment fragment3=tabSwitchAdapter.getItem(3);
((FragmentThree)fragment3.update();
pager.setCurrentItem(num);
}
片段X:

spinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView AdapterView、View视图、int i、long l){
rankObject=i;
((MainActivity)getActivity()).setRankObject(rankObject);
((MainActivity)getActivity()).startViewPage(X);
}
@凌驾
未选择公共无效(AdapterView AdapterView){
}
});
公共无效更新(){
rankObject=((MainActivity)getActivity()).getRankObject();
if(rankObject!=null){
//更新片段的数据
微调器。设置选择(rankObject);
}
否则{
Toast.makeText(getContext(),“秩为空”,Toast.LENGTH_SHORT.show();
}
}
我本以为这个解决方案会奏效,但我已经有好几分钟没有找到解决方案了。应用程序在方法
getRank()时崩溃被调用

 this.rankObject = ((MainActivity)getActivity()).getRankObject();
说对象引用为空,我不明白?每个对象都存在,并且主对象和每个片段的
rankObject
都初始化良好。。 这样做可能吗

以下是错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example, PID: 9641
    java.lang.NullPointerException: Attempt to invoke virtual method 'int com.example.dinovente.MainActivity.getRangProduit()' on a null object reference
        at com.example.FragmentOne.update(FragmentOne.java:201)
        at com.example.MainActivity.startViewPager(MainActivity.java:158)
        at com.example.FragmentTwo.onItemSelected(FragmentTwo.java:119)
        at android.widget.AdapterView.fireOnSelected(AdapterView.java:947)
        at android.widget.AdapterView.dispatchOnItemSelected(AdapterView.java:936)
        at android.widget.AdapterView.access$300(AdapterView.java:56)
        at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:901)
        at android.os.Handler.handleCallback(Handler.java:891)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:7470)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)

NPE发生的原因是,通过调用
tabSwitchAdapter.getItem(1)
,您可能正在创建一个全新的片段,该片段未被您的viewpager使用,因此未附加到活动(除非您保留对片段的引用,这不是一个好主意)

到目前为止,要在一个活动中的片段之间进行通信,最简单的方法是使用android架构组件ViewModel和LiveData。
这里有一个详细的说明:

使用
FragmentPagerAdapter
,并参阅以了解如何检索片段(
getItem()
应返回新的项目)。您可以应用广播接收器更新其他片段类。您也可以使用