2017-02-21 21 views
-3

Как передать данные из одного фрагмента другому, когда кнопка нажата из активности, в которой запускается плейер представления.Как передать данные из одного фрагмента другому в View Pager

activity_main.xml

<android.support.v4.view.ViewPager 
     android:elevation="@dimen/activity_horizontal_margin" 
     android:id="@+id/view_pager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
    </android.support.v4.view.ViewPager> 


    <Button 
     android:id="@+id/btn_next" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:background="@null" 
     android:text="@string/next" 
     android:textColor="@android:color/white" /> 

, когда я нажимаю btn_next затем следующий фрагмент покажет. Как я буду извлекать данные из предыдущего фрагмента в текущий фрагмент?

У меня есть один фрагмент:

public class BpDetails extends Fragment { 

     private int page; 

    private EditText systolic; 
    private EditText diastolic; 

    // newInstance constructor for creating fragment with arguments 
     public static BpDetails newInstance(int page) { 
      BpDetails fragmentFirst = new BpDetails(); 
      Bundle args = new Bundle(); 
      args.putInt("someInt", page); 
      fragmentFirst.setArguments(args); 
      return fragmentFirst; 
     } 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      page = getArguments().getInt("someInt", 0); 
     } 


     // Inflate the view for the fragment based on layout XML 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      final View view = inflater.inflate(R.layout.bp_details, container, false); 

      Log.i("View ",view.toString()); 


      systolic =(EditText) view.findViewById(R.id.systolic); 
      diastolic =(EditText) view.findViewById(R.id.diastolic); 


      return view; 
     } 
} 

и страница адаптера

public static class MyPagerAdapter extends FragmentPagerAdapter { 
     private static int NUM_ITEMS = 4; 
     private static int mSelectedPosition; 

     public MyPagerAdapter(FragmentManager fragmentManager) { 
      super(fragmentManager); 
      //mSelectedPosition=selectedPosition; 
     } 

     // Returns total number of pages 
     @Override 
     public int getCount() { 
      return NUM_ITEMS; 
     } 

     // Returns the fragment to display for that page 
     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: // Fragment # 0 - This will show FirstFragment 
        return BasicDetails.newInstance(0); 
       case 1: 
        return BpDetails.newInstance(1); 
       case 2: 
        return BslDetails.newInstance(2); 
       case 3: 
        return Summary.newInstance(3); 

       default: 
        return null; 
      } 
     } 

    } 

Для всего разъяснений я хочу получить доступ к значению систолического в другом фрагменте, когда пользователь нажимает на btn_next активности.

Update:

Я стараюсь сделать так в фрагменте.

public String getSystolic(){ 

      return this.systolic.getText().toString(); 

     } 

тогда, когда пользователь нажимает на следующую кнопку

Fragment bpFragment=adapterViewPager.getItem(vpPager.getCurrentItem()); 

        if (bpFragment instanceof BpDetails){ 

         System.out.println("Current item is "+vpPager.getCurrentItem()); 

         Fragment f=adapterViewPager.getInstantiatedFragment(vpPager.getCurrentItem()); 


         BpDetails fr = (BpDetails)adapterViewPager.getItem(vpPager.getCurrentItem()); 

         String systolicString = fr.getSystolic(); 

         Log.i("Systolic is ",systolicString); 
        } 
+0

http://stackoverflow.com/questions/16036572/how-to-pass-values-between-fragments refere эту ссылку вы можете лучше понять – KrishnaJ

+0

http://stackoverflow.com/a/39252949/4387357 –

+0

@KrishnaJ ссылка, которую вы опубликовали, говорит о передаче данных из одного фрагмента другому, когда я нажимаю кнопку в одном фрагменте. В моем случае нет триггерной точки в фрагменте. Мне нужно сделать это только через основную деятельность btn. –

ответ

0

Внедрить общедоступный метод getData в исходном фрагменте и метод setData в целевом фрагменте.

На следующей кнопкой мыши, найти в настоящее время видимый фрагмент и получить данные из этого фрагмента getSupportFragmentManager() findFragmentByTag (. "Android: переключатель:". + GetViewPager() GetId() + ":" + fragmentPagerAdapter.getItemId (позиция));

после этого переходим к следующему фрагменту и метод onPageSelected найти следующий видимый фрагмент и набор данных их

+0

, поскольку целевой фрагмент содержит заданный текст, поэтому нет определенного способа я могу вызвать метод setData. Если я назову это, когда пользователь коснется/щелкнет текст редактирования, скорее всего, я не получу текущее значение. @Hiren. у вас есть моя проблема? –

+0

@AnkurKhandelwal сначала получает систолическое значение из фрагмента BpDetails, после чего переходите к следующему фрагменту с помощью метода setCurrentItem ViewPager. В методе onPageSelected получить следующий экземпляр фрагмента и установить значение –

+0

. В этом проблема не получается получить систолическое значение. Поскольку имеется только edittext, пользователь может или не может заполнять данные. Я могу получить систолические данные только тогда, когда пользователь нажимает следующую кнопку, но за пределами фрагмента, поэтому не может получить доступ к систолической переменной. @Hiren есть ли способ получить к нему доступ? –

0

Активность:

FirstFragment.newInstance(0, "Page # 1"); 

Фрагменты:

public static FirstFragment newInstance(int page, String title) { 
    FirstFragment fragmentFirst = new FirstFragment(); 
    Bundle args = new Bundle(); 
    args.putInt("someInt", page); 
    args.putString("someTitle", title); 
    fragmentFirst.setArguments(args); 
    return fragmentFirst; 
} 

Для более подробной информации см ссылку: https://guides.codepath.com/android/ViewPager-with-FragmentPagerAdapter

+0

Таким образом, я могу передавать данные только из активности viewpager в фрагмент. но я не знаю данных фрагмента в активности пейджера представления –

0

putArgumentsOnScrollChangeListener и getArguments на другом фрагменте.

или вы можете также использовать

LocalBroadCast для передачи данных от одного фрагмента к другому в ViewPager.

+0

, если я использую первый метод. то как я получу идентификатор фрагмента в активности пейджера представления. –

+0

просто получите фрагмент из ViewPagerAdapter в позиции. – LearnPainLess

+0

Я обновил свой вопрос с помощью адаптера и фрагмента. Можете ли вы помочь мне с кодом. Я не получаю. Простите за это. –

0

Самый простой способ сделать это с помощью EventBus библиотеки.