如何将变量从活动传递到片段不能解决所有先前的问题

时间:2019-04-12 13:32:04

标签: java android android-layout android-fragments

如何将变量从 ViewSyllabusActivity 传递给片段尝试了很多示例,而且很多时候我想将数据 ViewSyllabusActivity .java传递给Fragment.java,但无法发送数据提前帮我谢谢

ViewSyllabusActivity.java

def ndhist(vectors, bins=1000, title=None):
    t = time.time()
    limits = (vectors.min(), vectors.max())
    hists = []
    dims = vectors.shape[1]
    for dim in range(dims):
        h, bs = np.histogram(vectors[:, dim], bins=bins, range=limits)
        hists.append(h)
    hists = np.array(hists)

    fig = plt.figure(figsize=(16, 12))
    sns.heatmap(
        hists,
        yticklabels=50,
        xticklabels=False
    )

    axes = fig.gca()
    axes.set(
        ylabel=f'dimensions ({dims} total)',
        xlabel=f'values (min: {limits[0]:.4g}, max: {limits[1]:.4g}, {bins} bins)',
        title=title,
    )

    def val_to_idx(val):
        # calc (linearly interpolated) index loc for given val
        return bins*(val - limits[0])/(limits[1] - limits[0])
    xlabels = [round(l, 3) for l in limits] + [
        v for v in matplotlib.ticker.AutoLocator().tick_values(*limits)[1:-1]
    ]
    # drop auto-gen labels that might be too close to limits
    d = (xlabels[4] - xlabels[3])/3
    if (xlabels[1] - xlabels[-1]) < d:
        del xlabels[-1]
    if (xlabels[2] - xlabels[0]) < d:
        del xlabels[2]
    xticks = [val_to_idx(val) for val in xlabels]
    axes.set_xticks(xticks)
    axes.set_xticklabels([f'{l:.4g}' for l in xlabels])

    plt.show()
    print(f'histogram generated in {time.time() - t:.2f}s')

ndhist(np.random.randn(100000, 300), bins=1000, title='randn')

Fragment.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_syllabus);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
        setupTabIcons();

        Intent intent = getIntent();
        int sem = intent.getIntExtra(SubListActivity.EXTRA_NUMBER, 0);
        String sid = intent.getStringExtra(SubListActivity.EXTRA_TEXT);

    }
    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());

        adapter.addFrag(new ObjFragment(), "Objectives");
        adapter.addFrag(new ContActivity(), "Contents");
        adapter.addFrag(new LaboActivity(), "Laboratory");
        adapter.addFrag(new TBActivity(), "Text Books");
        adapter.addFrag(new LaboActivity(), "References");
        viewPager.setAdapter(adapter);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFrag(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

    }

2 个答案:

答案 0 :(得分:2)

使用EventBus。这真的很容易而且很好。

1-创建事件:

public class SendDataToFragmentEvent{
private YourDataType yourData;

 public SendDataToFragmentEvent(YourDataType yourData){ 
  this.yourData = yourData;
 }

 public void getYourData(){return yourData;}

}

在您要发送数据到片段的那一刻,

EventBus.getDefault.post(new SendDataToFragmentEvent(yourDataHere));

然后您必须等待片段中的数据:

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onSendDataToFragmentEvent(SendDataToFragmentEventevent 
 event) {
/* Do something with your data here*/
};

别忘了EventBus必须知道何时开始收听或停止:

 @Override
 public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
 }

 @Override
 public void onStop() {
   super.onStop();
   EventBus.getDefault().unregister(this);
 }

这是因为Eventbus永远待在这里,直到您的片段/活动被破坏为止。

注意:必须打开该片段以侦听您的事件的活动。

Here是该库的链接,我发现它真的很好。

答案 1 :(得分:0)

您已经在ViewPagerAdapter中发送了一些值,如下所示:-

@Override
public Fragment getItem(int position) {
    Bundle bundle = new Bundle();
    if(position == 0){
        bundle.putInt("position", position);
        bundle.putString("survayType", "your value");
        mFragmentList.get(position).setArguments(bundle);
    }else if(position == 1){
        bundle.putInt("position", position);
        bundle.putString("survayType", "your value");
        mFragmentList.get(position).setArguments(bundle);
    }else if(position == 2){
        bundle.putInt("position", position);
        bundle.putString("survayType", "your value");
        mFragmentList.get(position).setArguments(bundle);
    }else if(position == 3){
        bundle.putInt("position", position);
        bundle.putString("survayType", "your value");
        mFragmentList.get(position).setArguments(bundle);
    }else if(position == 4){
        bundle.putInt("position", position);
        bundle.putString("survayType", "your value");
        mFragmentList.get(position).setArguments(bundle);
    }

    return mFragmentList.get(position);
}

并像这样获取片段中的值:-

String survayType = getArguments().getString("survayType");

我这样做,它对我有用。