我的条件是我有三个片段A,B,C,我在Afragment中设置值并在Cfragment中获取值。
我希望在Afragment中将布局更改为Bfragment。
编译项目显示Bundle.getSerializable(java.lang.String)' on a null object reference
我在Bfragment中将布局更改为Cfragment。
我想使用Serializable来让我在Cfragment中获得价值。
我如何完成它?任何帮助将不胜感激。
我的Serializable bean:
public class Book implements Serializable {
String name;
public Book(){
}
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我的主要活动:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
A a=new A();
switchFragment(a);
}
public void switchFragment(Fragment fragment) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.main_frameLayout, fragment, null);
transaction.addToBackStack(null);
transaction.commit();
}
}
Afragment:
public class A extends Fragment {
B b=new B();
public A() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_a, container, false);
Book book=new Book();
book.setName("Jerry");
//try to send the value to Cfragment
C c=new C();
Bundle bundle=new Bundle();
bundle.putSerializable("name",book);
c.setArguments(bundle);
//change layout into Bfragment
Button button=(Button)view.findViewById(R.id.buttonA);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
switchFragment(b);
}
});
return view;
}
public void switchFragment(Fragment fragment) {
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.main_frameLayout, fragment, null);
transaction.addToBackStack(null);
transaction.commit();
}
}
Bfragment:
public class B extends Fragment {
C c=new C();
public B() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_b, container, false);
//change layout into Cfragment
Button button=(Button)view.findViewById(R.id.buttonB);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
switchFragment(c);
}
});
return view;
}
public void switchFragment(Fragment fragment) {
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.main_frameLayout, fragment, null);
transaction.addToBackStack(null);
transaction.commit();
}
}
Cfragment:
public class C extends Fragment {
Book book;
public C() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_c, container, false);
TextView textView=(TextView)view.findViewById(R.id.textC);
//try to get the setting value from Aframent
Bundle bundle=getArguments();
book=(Book) bundle.getSerializable("name");
textView.setText(book.getName());
return view;
}
}
根据CoDFather的回应,我改变了这样:
public static C newInstance(String param1) {
C fragment = new C();
Bundle args = new Bundle();
Book book=new Book();
book.setName(param1);
args.putSerializable("name", book); // in your case it is serializable
fragment.setArguments(args);
return fragment;
}
在A:
C.newInstance("Jerry");
在C onCreate中:
Book book=(Book) getArguments().getSerializable("name");
textView.setText(book.getName());
当B到C时: 它在返回片段
中显示Serializable android.os.Bundle.getSerializable(java.lang.String)' on a null object reference
答案 0 :(得分:0)
在Fragment A
中你正在做那个
C c=new C();
Bundle bundle=new Bundle();
bundle.putSerializable("name",book);
c.setArguments(bundle);
但您没有使用c
片段中的C
个对象。
取而代之的是片段B
您定义了C c=new C();
这是C
片段的全新对象,然后您切换到这个新的c
而没有设置参数。
简单地说,您正在设置对象的参数,然后再使用另一个对象!
这就是getArguments()
returen null
如果您想将A
的{{1}}传递给C
,则需要先将A
传递给B
,然后再将其传递给C
B
中的onCreateView
中
c.setArguments(getArguments());
然后您可以切换到此c
答案 1 :(得分:0)
在你的片段A中执行此操作
<form action="" method="post">
<input type="number" name="contact_ID" placeholder="Id" value="<?php echo $id;?>"><br><br>
<input type="text" name="first_name" placeholder="First Name" value="<?php echo $fname;?>"><br><br>
<input type="text" name="middle_name" placeholder="Middle Name" value="<?php echo $midname;?>"><br><br>
<input type="text" name="last_namename" placeholder="Last Name" value="<?php echo $lname;?>"><br><br>
<div>
<input type="submit" name="insert" value="Add">
<input type="submit" name="update" value="Update">
<input type="submit" name="search" value="Find">
</div>
</form>
片段B中的
B b=new B();
Bundle bundle=new Bundle();
bundle.putSerializable("name",book);
b.setArguments(bundle);
并使用 C c=new C();
c.setArguments(getArguments());
switchFragment(c);
返回null的原因是,您正在设置参数 一个人并使用另一个人。
但不建议这样做。请改用getArguments()
。
newInstance
并在创建
public static C newInstance(String param1, String param2) {
C fragment = new C();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1); // in your case it is serializable
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
并使用@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
。在你的情况下,用bundle替换它。
答案 2 :(得分:0)
我找到一个解决方案来保存我的问题,它是关于单身人士:
我将它用于我的Book类,如下所示:
Book book=Book.getBook();
book.setName("Jerry");
在A:
Book book=Book.getBook();
textView.setText(book.getName());
在C:
CREATE TABLE `cake_sessions` (
`id` varchar(255) NOT NULL DEFAULT '',
`data` text,
`expires` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
然后我的问题结束了,我必须放弃Serializable。