java - 使用 FragmentInteractionListener 将对象片段传输到片段不起作用
问题描述
我使用 onFragmentInteraction 作为片段之间通信的函数。这两个片段是confirm_screen 和detailsForm。我打算将 Person 类的对象(在 MainActivity.java 文件中声明)从 detailsForm 发送到 confirm_screen。onFragmentInteraction 函数是接口 OnFragmentInteractionListener 的一部分。该接口在 MainActivity.java 文件中实现(功能实现)。函数体是:
@Override
public void onFragmentInteraction(Person person)
{
Confirm_Screen personinfoFrag = (Confirm_Screen)
getSupportFragmentManager().findFragmentById(R.id.confirm_Screen);
// Log.d("name", "Taimoor");
if (personinfoFrag!=null) {
// If confirm frag is available, we're in two-pane layout...
// Call a method in the confirm to update its content
personinfoFrag.SetPerson(person);
Log.d("name", "Taimoor");
}
else
{
FragmentTransaction transaction=getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.nav_host_fragment, personinfoFrag);
transaction.addToBackStack(null);
Log.d("name", "I am in else you dummies");
personinfoFrag.SetPerson(person);
transaction.commit();
}
}
这是 DetailsForm 类 (DetailsFrom.java) 的 onCreateView 函数,其中调用了 onFragmentInteraction:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_details_form, container, false);
P= new Person();
//Button Setting
submitButton=(Button)view.findViewById(R.id.setperson);
//Setting Values
Name=((EditText)view.findViewById(R.id.inputName)).getText().toString();
hairColor=((EditText)view.findViewById(R.id.inputHairColor)).getText().toString();
CNIC=((EditText)view.findViewById(R.id.inputCNIC)).getText().toString();
skinColor=((EditText)view.findViewById(R.id.inputSkinColor)).getText().toString();
description=((EditText)view.findViewById(R.id.pDescription)).getText().toString();
suspectedCrime=((EditText)view.findViewById(R.id.inputPersonCrime)).getText().toString();
lastKnownLocation=((EditText)view.findViewById(R.id.inputLocation)).getText().toString();
//viewholderColor=
// imagename=
P.setCNIC(CNIC);
P.setDescription(description);
P.setHairColor(hairColor);
P.setImagename(Name);
P.setLastKnownLocation(lastKnownLocation);
P.setSuspectedCrime(suspectedCrime);
P.setSkinColor(skinColor);
submitButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
{
if (mListener != null) {
mListener.onFragmentInteraction(P);
Log.d("msg", "I am here");
}
Navigation.findNavController(view).navigate(R.id.action_detailsForm_to_confirm_Screen);
}
});
return view;
}
Here is the onAttach function in DetailsForm class(DetailsForm.java):
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
Here is where we set the person object newPerson in confirm_screen class(Confirm_Screen.java). The object newPerson is set with the person object passed in OnFragmentInteraction in DetailsForm class.
//Setting Value of P
public void SetPerson(Person person)
{
newPerson=person;
Log.d("name", newPerson.getName());
}
在这里,我们将 person 对象的属性设置为将显示在屏幕上的文本视图。我们在 Confirm_Screen 类的 onCreateView 函数中设置值:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_confirm__screen, container, false);
ConfirmBtn=(Button)view.findViewById(R.id.confirmPerson);
//Setting Values
/*
public TextView pname;
public TextView cnic;
public TextView pDescription;
public TextView pskinc;
public TextView shairc;
public TextView pcrime;
public TextView Location;
*/
pname=(TextView)view.findViewById(R.id.pname);
pname.setText(newPerson.getName());
shairc=(TextView)view.findViewById(R.id.shairc);
shairc.setText(newPerson.getHairColor());
cnic=(TextView)view.findViewById(R.id.CNIC);
cnic.setText(newPerson.getCNIC());
pskinc=(TextView)view.findViewById(R.id.pskinc);
pskinc.setText(newPerson.getSkinColor());
pDescription=(TextView)view.findViewById(R.id.pDescription);
pDescription.setText(newPerson.getDescription());
pcrime=(TextView)view.findViewById(R.id.pcrime);
pcrime.setText(newPerson.getSuspectedCrime());
Location=(TextView)view.findViewById(R.id.Location);
Location.setText(newPerson.getLastKnownLocation());
.....rest of the code
}
我们的问题是当我们在设备上运行应用程序并到达 detailsForm 时。当我们单击 DetailsForm 上的提交按钮时,消息显示:EAGLEVISION 已停止工作。
logcat控制台上的错误是:尝试在空对象引用上调用虚拟方法'void android.widget.textview.settext(java.lang.charsequence)'它指向的setText函数在confirm_screen的OnCreateView中在线。
供参考的人员类是:
class Person
{
private String ID;
private String name;
private String hairColor;
private String CNIC;
private String skinColor;
private String description;
private String suspectedCrime;
private String lastKnownLocation;
private int viewholderColor;
private String idimageref;
private String imagename;
}
已为每个属性编写了 Getter/Setter。
请问有人可以帮忙吗??
解决方案
推荐阅读
- mongodb - 猫鼬 findOneAndUpdate 不保存
- centos7 - 为 Openstack Ironic Boot Failure 生成 CentOS 映像
- ios - 如何使用 cocoapods 制作 swift 本机模块以响应本机
- java - Java - 从 PDF 文件中提取不重复的单词
- java - 多边形由不同宽度和高度的垂直相邻塔组成。找到适合此多边形的矩形的最大区域
- .htaccess - 使用 htaccess 从 url 中删除尾部斜杠
- reactjs - 失败的道具类型:提供给“DetailField”的“字符串”类型的无效道具“孩子”,应为“对象”
- flutter - Flutter:查找两个日期之间的天数
- c - 为什么 OpenSSL 加密函数在成功时返回 1,在失败时返回 0?
- python - 如何让物体以不同的模式移动