2016-04-13 3 views
1

У меня есть ViewPager в моем MainActivity. Каждая страница в нем - это фрагмент. Таким образом, каждый раз, когда я сажусь вправо или влево, создается новый экземпляр фрагмента и соответственно обновляется представление фрагмента.Перейти на следующую страницу в ViewPager

У меня также есть две кнопки: LEFT и RIGHT для навигации. Эти кнопки: внутри фрагмента, а не в действии. Пользователь может прокручивать или альтернативно нажимать соответствующую кнопку для перемещения между страницами.

В этом случае проблема: поскольку я меняю виды через свою MainActivity, как я могу определить события onClick этих кнопок в Activity, чтобы обновить фрагмент?

Вот PagerAdapter класс (Удалены все значения кода из везде):

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 

     // logic part for the views. 

     return PlaceholderFragment.newInstance(sectionNumber, questionStatus, questionOrder, showNext, showPrevious); 
    } 

А вот PlaceHolderFragment класс:

public class PlaceholderFragment extends Fragment{ 

    //some global variables 

    public static PlaceholderFragment newInstance(int sectionNumber, int questionStatus, String questionOrder, boolean showNext, boolean showPrevious) { 
     PlaceholderFragment fragment = new PlaceholderFragment(); 

     //setting up the arguments 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public PlaceholderFragment() { 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.explanation_fragment, container, false); 

     //code for filling up all the views 

     RightButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //can I do something here? 
      } 
     }); 

     return rootView; 
    } 
} 

ДОПОЛНИТЕЛЬНО: Я должен держать навигации кнопок в самом фрагменте, а не в действии.

+0

Присоединить кнопку для компоновки mainactivity. –

+0

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

+0

@MustanserIqbal, да, это вариант, но я должен держать кнопки в самом фрагменте. Есть ли другой способ обхода? –

ответ

7

В вашем фрагменте написать один интерфейс, как:

public class PlaceholderFragment extends Fragment{ 
     private OnButtonClickListener mOnButtonClickListener; 

     interface OnButtonClickListener{ 
     void onButtonClicked(View view); 
     } 

     @Override 
     public void onAttach(Context context) { 
      super.onAttach(context); 
      try { 
       mOnButtonClickListener = (OnButtonClickListener) context; 
      } catch (ClassCastException e) { 
       throw new ClassCastException(((Activity) context).getLocalClassName() 
          + " must implement OnButtonClickListener"); 
      } 
     } 

     yourButtons.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mOnButtonClickListener.onButtonClicked(v); 
      } 
     }); 
    } 

И в вашем mainactivity:

class MainActivity extends AppCompatActivity implements OnButtonClickListener{ 

    @Override 
    void onButtonClicked(View view){ 
     int currPos=yourPager.getCurrentItem(); 

     switch(view.getId()){ 

      case R.id.leftNavigation: 
      //handle currPos is zero 
      yourPager.setCurrentItem(currPos-1); 
      break; 

      case R.id.rightNavigation: 
      //handle currPos is reached last item 
      yourPager.setCurrentItem(currPos+1); 
      break; 
     } 
    } 
} 
+0

Это, безусловно, правильные ответы !!! – TacoEater

+0

Ницца идея. Работает отлично. –

0

кнопку Вы можете добавить в вашей деятельности XML следующим образом

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_weight="1" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="1" > 

     <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 
     </android.support.v4.view.ViewPager> 
    </LinearLayout> 

    <ImageView 
     android:id="@+id/leftNavigation" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:gravity="center" 
     android:padding="10dp" 
     android:src="@drawable/ic_chevron_left_black_24dp" 
     android:visibility="gone" /> 

    <ImageView 
     android:id="@+id/rightNavigation" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="right" 
     android:layout_weight="0" 
     android:gravity="center" 
     android:padding="10dp" 
     android:src="@drawable/ic_chevron_right_black_24dp" /> 
    </FrameLayout> 
0

Вы можете создать специальный метод в родителю Activity как следующее:

public class PagerActiviy extends Activity { 
    ... 
    public void onFragmentNavigationButtonClick(View button) { 
     // Do your stuff here 
    } 
    ... 
} 

Тогда в ваших фрагментов вы можете получить родительский Activity с методом getActivity(), выдать его фактическому типу и вызвать метод:

public class PlaceholderFragment extends Fragment{ 

... 
... 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.explanation_fragment, container, false); 

     //code for filling up all the views 

     RightButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ((PagerActvity) getActivity()).onFragmentNavigationButtonClick(v); 
      } 
     }); 

     return rootView; 
    } 
} 
1

Публично метод в деятельности

public void swipeRight(int x){ 
    if(x < totalNumberOfFragment){ 
     viewPager.setCurrentItem(x + 1); 
    } 
} 

public void swipeLeft(int x){ 
    if(x > 0){ 
     viewPager.setCurrentItem(x - 1); 
    } 
} 

Вы можете назвать это метод от действия щелчка кнопки фрагмента

RightButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //Yes 
      ((YourActivityClassName)getActivity()).swipeRight(position); 
     } 
    }); 

И делать то же самое для LeftButton

YourActivityClassName - активность, которая держит этот фрагмент ViewPager.

позиция - положение вашего текущего фрагмента.

+1

Это неправильный способ сделать это, действие должно прослушивать взаимодействие фрагмента, а не вызывающие функции напрямую. Этот способ, скорее всего, приведет вас к исключениям жизненного цикла активности/фрагмента. Ответ Рама определенно правильный способ сделать это. – TacoEater

0

Вы можете отправить радиопередачу по нажатию кнопки внутри фрагмента, как показано ниже:

Intent intent = new Intent(); 
     intent.setAction(NUMBER_OF_RECEIVER_NEXT); 
     getActivity().sendBroadcast(intent); 

Тогда в вашей основной деятельности вы ловите Намерение и установить текущее положение пейджера до требуемого номера

private class broadcastReceived extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String actionGet = intent.getAction(); 
      if(actionGet.equals(NUMBER_OF_RECEIVER_NEXT)){ 

       mPager.setCurrentItem(1); 
       Log.e("IntentNextPage","Received"); 
      } 
     } 
    } 

не забудьте установить

private static final String NUMBER_OF_RECEIVER_NEXT = "nextPage"; 

как в основной деятельности и фрагмент и, конечно, регистрировать, отменить регистрацию приемника на методы onResume и onPause.

Также добавьте фильтр намерений к приемнику в OnCreate methd с действием, указанным в качестве NUMBER_OF_RECEIVER_NEXT