首页 > 解决方案 > 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;
    }
}

标签: javaandroidfragment

解决方案


有很多选择。
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是这种方法的演变。


推荐阅读