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
方法,是在主
片段
类中还是在
适配器
列表类中?