Android 如何使用serializable从活动到片段获取数据
如何检索我们从Android 如何使用serializable从活动到片段获取数据,android,android-fragments,android-recyclerview,Android,Android Fragments,Android Recyclerview,如何检索我们从活动输入到片段的数据?我用serializable方法尝试了这一点,但在从我的活动接收数据并将其应用到片段 活动类别: Intent intent = new Intent(AddImpianActivity.this, AktifFragment.class); AktifFragment aktifFragment = new AktifFragment(); Bundle bundle = new Bundle(); bundle.putSerializable("
活动
输入到片段
的数据?我用serializable
方法尝试了这一点,但在从我的活动
接收数据并将其应用到片段
活动类别:
Intent intent = new Intent(AddImpianActivity.this, AktifFragment.class);
AktifFragment aktifFragment = new AktifFragment();
Bundle bundle = new Bundle();
bundle.putSerializable("Data",impianItems);
aktifFragment.setArguments(bundle);
startActivity(intent);
这是活动类的完整代码:
这是活动项类的代码:
活动适配器:
片段类:
public class AktifFragment extends Fragment {
ArrayList<ImpianItem> items = new ArrayList<>();
public AktifFragment() {
// 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_aktif, container, false);
//null object reference
RecyclerView recyclerView = view.findViewById(R.id.rv_impian_list);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
items = (ArrayList<ImpianItem>) getArguments().getSerializable("Data");
ImpianAdapter adapter = new ImpianAdapter(items);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(layoutManager);
return view;
}
}
公共类AktifFragment扩展片段{
ArrayList items=新建ArrayList();
公共部门{
//必需的空公共构造函数
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.fragment_-aktif,容器,假);
//空对象引用
RecyclerView RecyclerView=view.findViewById(R.id.rv\u impian\u列表);
LinearLayoutManager布局管理器=新的LinearLayoutManager(getActivity());
items=(ArrayList)getArguments().getSerializable(“数据”);
ImpianAdapter=新ImpianAdapter(项目);
recyclerView.setAdapter(适配器);
recyclerView.setLayoutManager(layoutManager);
返回视图;
}
}
上面的代码,当我运行它时,从出现的消息来看,
片段
中的serializable
方法中有一个null错误。有解决方法吗?这里有一个简单的方法来序列化对象,将它们存储在SharedReferences中,然后存储在读取对象的片段中
在你的博客中:implementation'com.google.code.gson:gson:2.8.5'
在您的活动中:
val prefsEditor = getSharedPreferences()!!.edit()
val gson = Gson()
val json = gson.toJson(institucion)
prefsEditor.putString("institucion", json)
prefsEditor.commit()
在片段中,你可以这样读
val preferences = (activity as YourActivity).getSharedPreferences()
val gson = Gson()
val json = preferences.getString("institucion", "")
ong = gson.fromJson(json, Institucion::class.java)
这在kotlin中,但在java中是相同的概念。从如何从活动中调用片段的代码中,您没有传递带有setArguments()的片段;你只是把一个意图从你的活动传递给你的片段。要使用bundle打开活动中的片段,您应该在此处检查答案 您还可以在片段中创建一个新实例以传递到bundle中,然后创建一个常量来存储该值
public static AktifFragment newInstance(List<Items> impianItems) {
Bundle bundle = new Bundle();
AktifFragment aktifFragment = new AktifFragment();
bundle.putSerializable("Data",impianItems);
aktifFragment.setArguments(bundle);
return aktifFragment;
}
公共静态AktifFragment newInstance(列表项){
Bundle=新Bundle();
AktifFragment AktifFragment=新AktifFragment();
bundle.putSerializable(“数据”,impianItems);
aktifFragment.setArguments(bundle);
返回碎片;
}
然后在你的onCreate中,你会得到这样的结果
items = (ArrayList<ImpianItem>) getArguments().getSerializable("Data");
items=(ArrayList)getArguments().getSerializable(“数据”);
您不能使用startActivity
来“启动片段”
您可以使用活动(AktifActivity
在您的案例中)而不是片段,并使用以下附加项传递项目:
Intent intent = new Intent(AddImpianActivity.this, AktifActivity.class);
bundle.putSerializable("Data", impianItems);
startActivity(intent);
private ArrayList<ImpianItem> impianItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_aktif);
Intent intent = getIntent();
impianItems = (ArrayList<ImpianItem>) intent.getSerializable("Data");
...
}
在AktifActivity
中,您将能够通过以下方式获取项目:
Intent intent = new Intent(AddImpianActivity.this, AktifActivity.class);
bundle.putSerializable("Data", impianItems);
startActivity(intent);
private ArrayList<ImpianItem> impianItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_aktif);
Intent intent = getIntent();
impianItems = (ArrayList<ImpianItem>) intent.getSerializable("Data");
...
}
然后在活动代码中,使用片段管理器将片段放置在该FrameLayout
中:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
AktifFragment fragment = new FooFragment();
Bundle args = new Bundle();
args.putParcelable("Data", impianItems)
fragment.setArguments(args)
ft.replace(R.id.my_fragment, fragment);
ft.commit();
我相信问题在于你自己正在创建一个片段的实例。这是不应该发生的。除非您使用的是片段管理器,否则片段应该由系统构建——这里的情况似乎不是这样。尝试使用
putExtra
方法在Intent上传递数据。我是在activity
类中输入数据的,不是来自fragment
,应该使用getSerializable
方法是fragment
类,但我不知道如何放置getSerializable
方法,是在主片段
类中还是在适配器
列表类中?