7

我有一個ViewPager Activity,它調用表示幻燈片佈局的片段。通過包將ViewPager Activity的值發送到片段

我需要的是將活動的值通過捆綁傳遞給片段。 我該怎麼做?我試圖通過一個INT 2中的onCreate(),但不工作,我

活動:

@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(); 
+0

有你嘗試使用片段ID並獲得片段對象到其父活動然後在活動中設置變量define fragment from fragmentobject.side = activity.side – KDeogharkar

回答

18

你必須通過setArguments設置你的包()方法,而不是意圖。 如果您有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); 
/** 
* Instantiate a ViewPager and a PagerAdapter 
*/ 

    mPager = (ViewPager)findViewById(R.id.pager); 
    mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager(), bundle); 
    mPager.setAdapter(mPagerAdapter); 
} 

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

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"); 
} 
+0

你如何做相反的事?從片段轉移到活動? – Susheel

+0

@Susheel有很多種方法。你可以讓你的活動實現一個接口,例如'interface ValueReceiver {void setValue(T value);}'並從一個片段中執行'Activiy a = getActivity(); if(ValueReceiver的一個實例)((ValueReceiver)a).setValue(v);'或者使用'org.greenrobot.EventBus'或者'Observer'模式。甚至是一個'BroadcastReceiver'和'LocalBroadcastManager',但這是最糟糕的方法。 –

+0

很好的回答! +1 – CodeSlave

6

這可能不是你的想法完全要求的解決方案,但它是我做的,它可以幫助別人:

創建您的片段的公共方法:

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

在您的活動中,從適配器中獲取片段。你知道哪些片段是基於它在加入順序執行的片段方法,傳遞您的變量(S):

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