如何在片段之间共享公共资源?
How to share common resources between fragments?
我有一个带有 ViewPager 的 Activity,上面有 3 个选项卡。该应用程序以 EventFragment 开始,这是第一个选项卡,它包含可以在复选框中选中的项目。当我切换到第二个选项卡 TicketFragment 时,我想获取在 EventFragment 中选中的项目。
我最初的想法是做一个PagerActivity Singleton,让它存储所有的数据,然后可以从那里请求,但我不知道这是一个好方法
我的代码:
寻呼机Activity(启动器)
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);
}
}
PagerAdapter
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
TicketFragment:
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.单例是可以接受的,如果数据是新的class,activity不能是单例,activity的生命周期由android处理,但是VM是这种方法的演变.
我有一个带有 ViewPager 的 Activity,上面有 3 个选项卡。该应用程序以 EventFragment 开始,这是第一个选项卡,它包含可以在复选框中选中的项目。当我切换到第二个选项卡 TicketFragment 时,我想获取在 EventFragment 中选中的项目。
我最初的想法是做一个PagerActivity Singleton,让它存储所有的数据,然后可以从那里请求,但我不知道这是一个好方法
我的代码:
寻呼机Activity(启动器)
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);
}
}
PagerAdapter
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
TicketFragment:
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.单例是可以接受的,如果数据是新的class,activity不能是单例,activity的生命周期由android处理,但是VM是这种方法的演变.