java - Fragment之间如何共享公共资源?
问题描述
我有一个带有 ViewPager 的 Activity,上面有 3 个选项卡。该应用程序从 EventFragment 开始,这是第一个选项卡,它具有可以在复选框中选中的项目。当我切换到第二个选项卡 TicketFragment 时,我想获取在 EventFragment 中检查的项目。
我最初的想法是制作PagerActivity Singleton并让它存储所有数据,并且可以从那里请求它,但我不知道这是否是一个好方法。
我的代码:
PagerActivity(启动器)
public class PagerActivity extends AppCompatActivity {
public Activity activity = this;
private static final String TAG = "PagerActivity";
private BettingAdapter adapter;
private BettingListDatabase database;
private Answer bettingData=null;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pager);
}
@Override
protected void onResume() {
super.onResume();
ViewPager mainViewPager = findViewById(R.id.mainViewPager);
TabPagerAdapter tabPagerAdapter = new TabPagerAdapter(getSupportFragmentManager(), this);
mainViewPager.setAdapter(tabPagerAdapter);
}
}
寻呼机适配器
public class TabPagerAdapter extends FragmentPagerAdapter {
private Context context;
public TabPagerAdapter(FragmentManager fm, Context context) {
super(fm);
this.context = context;
}
// This method is called whenever the adapter needs a Fragment for a certain position
@Override
public Fragment getItem(int position) {
Fragment ret = null;
switch (position) {
case 0:
ret = new EventFragment();
break;
case 1:
ret = new TicketFragment();
break;
case 2:
ret = new BalanceFragment();
break;
}
return ret;
}
@Override
public CharSequence getPageTitle(int position) {
String title;
switch (position) {
case 0:
title = context.getString(R.string.events);
break;
case 1:
title = context.getString(R.string.ticket);
break;
case 2:
title = context.getString(R.string.balance);
break;
default:
title = "";
}
return title;
}
@Override
public int getCount() {
return 3;
}
}
事件片段:pastebin
票务片段:
public class TicketFragment extends Fragment {
private BettingAdapter adapter;
private RecyclerView recyclerView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.content_ticket,
container, false);
recyclerView = view.findViewById(R.id.MainRecyclerView);
adapter=new BettingAdapter((BettingAdapter.BettingItemClickListener) getActivity().getParent());
return view;
}
}
解决方案
有很多选择。
1.从EventFragment访问activity,在这里存储数据,从TicketFragment中读取。
2.将数据存储在首选项或数据库中,更多关于保存数据:https
://developer.android.com/training/data-storage/shared-preferences
3.为此共享状态创建VM,更多关于VM:https:// developer.android.com/topic/libraries/architecture/viewmodel
4. 单例是可以接受的,如果是新的数据类,活动不能是单例,由android处理的活动生命周期,但VM是这种方法的演变。
推荐阅读
- javascript - 如何为两个连接的字符串分配值和范围
- intellij-idea - 如何在打开驼峰的情况下在 Pycharm 中选择整个“camelCaseWord”
- java - Spring Boot 数据库初始化只有一次
- javascript - 从 Angular 5 下载 spring boot rest services 的文件
- angularjs - 使用角度方式删除行时,角度数据表消失
- datetime - 在 ElasticSearch 中以微秒格式保存日期
- python - Is there any way to make a timeseries scatterplot with array sizing in Matplotlib?
- ios - 聊天信使 UITableViewCell,正在加载消息
- python-3.x - 多处理中的 Google Stackdriver 不起作用
- android - 与模拟器相比,毕加索在真实设备中加载图像需要花费太多时间