Java 使用FragmentInteractionListener将对象片段传输到不工作的片段
我使用onFragmentInteraction作为片段之间通信的函数。这两个片段分别是确认屏幕和详细信息表单。我打算从detailsForm发送类Person的对象(在MainActivity.java文件中声明)到确认屏幕。函数onFragmentInteraction是接口OnFragmentInteractionListener的一部分。接口在MainActivity.java文件中实现(函数实现)。职能机构是:Java 使用FragmentInteractionListener将对象片段传输到不工作的片段,java,android,android-fragments,runtime-error,android-fragmentactivity,Java,Android,Android Fragments,Runtime Error,Android Fragmentactivity,我使用onFragmentInteraction作为片段之间通信的函数。这两个片段分别是确认屏幕和详细信息表单。我打算从detailsForm发送类Person的对象(在MainActivity.java文件中声明)到确认屏幕。函数onFragmentInteraction是接口OnFragmentInteractionListener的一部分。接口在MainActivity.java文件中实现(函数实现)。职能机构是: @Override public void onFrag
@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对象的属性设置为TextView,它将显示在屏幕上。
我们在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时。当我们单击Details上的submit按钮时,表单消息显示:EAGLEVISION已停止工作
logcat控制台上的错误为:
尝试在空对象引用上调用虚拟方法“void android.widget.textview.settext(java.lang.charsequence)”
它所指向的setText函数在确认屏幕的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
如果有人能帮忙,我会很感激的