我正在尝试编写将数据从片段发送到Android Studio中的另一个片段的方法。我已经有了创建此方法的示例应用程序。它工作正常。
我只是复制每个方法和界面与示例应用程序完全相同,并创建一个新的片段类(也与示例中的相同)。
The MainActivity looks like this
public class MainActivity extends AppCompatActivity implements FragmentOne.SendMessage, FragmentOne.SendMessageLanLon {
TabLayout tabLayout;
ViewPager viewPager;
ViewPagerAdapter viewPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
viewPager = (ViewPager) findViewById(R.id.viewPager);
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
@Override
public void sendData(String message) {
String tag = "android:switcher:" + R.id.viewPager + ":" + 1;
FragmentTwo f = (FragmentTwo) getSupportFragmentManager().findFragmentByTag(tag);
f.displayReceivedData(message);
}
@Override
public void sendDataLatLon(String message) {
String tag = "android:switcher:" + R.id.viewPager + ":" + 2;
FragmentThree f = (FragmentThree) getSupportFragmentManager().findFragmentByTag(tag);
f.displayReceivedDataLanLon(message);
}
}
sendData工作正常但sendDataLatLon崩溃了 - 我收到了消息
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());
}
});
在同一个片段中,当我使用另一个按钮(与上面相同)时,您可以在上面的logcat中看到行SLL.sendData中的错误。
这是我写的其余代码
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");
}
}
现在,参考日志,我不知道对象为何为空。我发送的消息不为空,方法是SAME作为工作方式。
我的方法中的标记值是否有问题? 这是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;
}
或许我可以使用相同的方法将值传递给另一个片段,但我不知道如何。我刚开始学习android。试图了解它是如何工作的:/
答案 0 :(得分:0)
FragmentThree f = (FragmentThree) getSupportFragmentManager().findFragmentByTag(tag);
这将返回Null
,因为活动中FragmentThree不是inflating
。当我们使用ViewPager
时,只有前一个和下一个Fragment
会膨胀而不是全部{{} 1}}。
答案 1 :(得分:0)
使用此代码解决此问题
在活动中 @覆盖 public void sendDataLatLon(String message){ String tag =“android:switcher:”+ R.id.viewPager +“:”+ 2; viewPagerAdapter.sendData(消息); }
在ViewPagerAdapter类中 String message =“”;
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;
}
在FragmentThree片段中 String message1 =“”;
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);
}