【问题标题】:Send values from ViewPager Activity to a Fragment by bundle通过捆绑将值从 ViewPager Activity 发送到 Fragment
【发布时间】:2013-02-06 11:18:55
【问题描述】:

我有一个 ViewPager Activity,它调用代表幻灯片布局的片段。

我需要的是通过捆绑将值从活动传递到片段。 我该怎么做?我尝试在 onCreate() 中传递一个 int 2 但不起作用,我

活动:

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_screen_slide);
    Intent intent = new Intent(this,ScreenSlidePageFragment.class);
    Bundle bundle = new Bundle();
    bundle.putInt("SIDE",2);
    intent.putExtras(bundle);
/**
 * Instantiate a ViewPager and a PagerAdapter
 */

    mPager = (ViewPager)findViewById(R.id.pager);
    mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
    mPager.setAdapter(mPagerAdapter);
    mPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int arg0) {
            if(itemOld > arg0){
                auxBack--;
                SIDE=1;
            }
            else if(itemOld < arg0){
                auxFront++;
                SIDE=0;
            }
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
            // TODO Auto-generated method stub

        }
    });
}

@Override
public void onBackPressed(){
    if(mPager.getCurrentItem()==0){
        super.onBackPressed();
    }else{
        mPager.setCurrentItem(mPager.getCurrentItem()-1);
    }
} 


/**
 * A simple pager adapter that represents 5 ScreenSlidePageFragment objects, in sequence
 */

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter{
    public ScreenSlidePagerAdapter(FragmentManager fm){
        super(fm);
    }

    @Override
    public ScreenSlidePageFragment getItem(int arg0) {
        return new ScreenSlidePageFragment();
    }

    @Override
    public int getCount() {
        //Toast.makeText(getApplicationContext(), "Num pages " + NUM_PAGES, Toast.LENGTH_LONG).show();
        return  NUM_PAGES;
    }
}

}

片段:

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle    savedInstanceState) {

    int tID = ((ScreenSlidePagerActivity)getActivity()).getIntent().getExtras().getInt("SIDE");
    Toast.makeText(getActivity(), "Side selected....." +tID,   Toast.LENGTH_LONG).show();

【问题讨论】:

  • 您是否尝试使用片段 ID 将片段对象获取到其父活动,然后从片段对象.side = activity.side 等活动设置片段中定义的变量

标签: android android-fragments android-activity android-viewpager bundle


【解决方案1】:

您必须通过 setArguments() 方法设置您的 Bundle,而不是意图。 如果您有 ViewPager,则可以将参数传递给 PagerAdapter,并在实例化 Fragment 时设置参数。

我不明白你的 SIDE 是如何计算的以及它是什么意思,所以我展示了一般的 ide。

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_screen_slide);
    Bundle bundle = new Bundle();
    bundle.putInt("SIDE",2);
    mPager = (ViewPager)findViewById(R.id.pager);
    mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager(), bundle);
    mPager.setAdapter(mPagerAdapter);
}


private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter{

    private final Bundle fragmentBundle;

    public ScreenSlidePagerAdapter(FragmentManager fm, Bundle data){
        super(fm);
        fragmentBundle = data;
    }

    @Override
    public ScreenSlidePageFragment getItem(int arg0) {
        final ScreenSlidePageFragment f = new ScreenSlidePageFragment();
        f.setArguments(this.fragmentBundle);
        return f;
    }

    @Override
    public int getCount() {
        return  NUM_PAGES;
    }
}

片段

@Override
public void onCreate(Bundle state) {
    super.onCreate(state);
    final Bundle args = getArguments();
    final int side = args.getInt("SIDE");
}

【讨论】:

  • 你如何做相反的事情?从片段转移到活动?
  • @Susheel 有很多方法。您可以使您的活动实现一个接口,例如interface ValueReceiver {void setValue(T value);} 并从片段中执行Activiy a = getActivity(); if (a instanceof ValueReceiver) ((ValueReceiver) a).setValue(v); 或使用org.greenrobot.EventBusObserver 模式。甚至是BroadcastReceiverLocalBroadcastManager,但这是最糟糕的方法。
  • 很好的答案! +1
【解决方案2】:

这可能不是您确切要求的解决方案,但这是我所做的,它可能会帮助某人:

在您的片段中创建一个公共方法:

public void doSomething(String myValue){
     // Do stuff in your fragment with myValue
}

在您的活动中,从您的适配器获取片段。您可以根据添加的顺序知道它是哪个片段。执行您的片段方法,传入您的变量:

// Get FriendsFragment (first fragment)
MyFragment fragment = (MyFragment) mAdapter.getItem(0);
fragment.doSomething("some-value");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    相关资源
    最近更新 更多