10

che sto seguendo this esempio ..selettore Tab non funziona sulla scheda precedente fare clic quando colpo su viewpager

Sto avendo un problema, quando ho swipe su ViewPager rispettivi fragment appaiono ma quando ho scorrere da da sinistra a destra o destra a sinistra e selezionare la scheda precedente l'indicatore Tab appare nella nuova scheda selezionata ma il rispettivo fragment non viene visualizzato su ViewPager. Per favore aiutami, dove mi sto sbagliando?

+0

aggiungere alcune immagini per chiarire la tua domanda per esempio come appare prima e dopo –

+0

sto avendo lo stesso problema. Ho 4 schede in un TabLayout, l'installazione con un ViewPager. Diciamo che sono nella scheda 0. Se scorro verso destra, vado nella scheda 1. Se scorro a sinistra, torno alla scheda 0. Tutto funziona, gli interruttori di layout scheda, viewpager mostra il frammento corretto. Il problema è qui: I'm on tab 0. Se I SWIPE alla scheda 1, funziona, ma se poi CLIC scheda 0, il layout della scheda "tabIndicator" andrà alla scheda 0, ma il viewpager non cambierà il frammento e il titolo della scheda 1 rimarrà evidenziato. Si risolve immediatamente facendo clic o sfiorando. – Andrew

+1

FYI sto usando TabLayout e ViewPager con il metodo setupWithViewPager() – Andrew

risposta

5

Era bug a sostegno lib 23.0.0 ma è risolto in 23.0.1. Prima di tutto aggiornare la libreria suppory utilizzando il gestore SDK dalla sezione extra. e scrivi la seguente riga nel file gradle dell'app.

compile 'com.android.support:appcompat-v7:23.0.1' compile 'com.android.support:design:23.0.1'

per il vostro riferimento

https://developer.android.com/topic/libraries/support-library/revisions.html e leggere i Modifiche per il supporto Design Library in libreria di supporto Android, revisione 23.0.1 sezione

+1

Grazie amico, Mi ha salvato un po 'di tempo :) –

+1

Grazie Man, hai risolto il mio problema su cui ho trascorso il mio 1 giorno :) –

+0

ma non è stata accettata risposta lol ... – Moinkhan

3

Questo è quello che uso e funziona bene.

Adapter:

public class SCFragmentPagerAdapter extends FragmentPagerAdapter { 

    private final List<Fragment> mFragments = new ArrayList<>(); 
    private final List<String> mFragmentTitles = new ArrayList<>(); 

    private Context mContext; 
    private FragmentManager mFragmentManager; 

    public SCFragmentPagerAdapter(FragmentManager fm, Context context) { 
     super(fm); 
     this.mFragmentManager = fm; 
     this.mContext = context; 
    } 

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

    // Return the correct Fragment based on index 
    @Override 
    public Fragment getItem(int position) { 
     return mFragments.get(position); 
    } 

    public void addFragment(Fragment fragment, String title) { 
     mFragments.add(fragment); 
     mFragmentTitles.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     // Return the tab title to SlidingTabLayout 
     return mFragmentTitles.get(position); 
    } 


    public Fragment getActiveFragment(ViewPager container, int position) { 
     String name = makeFragmentName(container.getId(), position); 
     return mFragmentManager.findFragmentByTag(name); 
    } 

    private static String makeFragmentName(int viewId, int index) { 
     return "android:switcher:" + viewId + ":" + index; 
    } 

} 

attività:

public class SCWelcomeActivity extends AppCompatActivity implements 
     SCWelcomeFragment.OnFragmentInteractionListener, 
     SCSyncFragment.OnFragmentInteractionListener, 
     SCRegisterFragment.OnFragmentInteractionListener, 
     SCConfirmationFragment.OnFragmentInteractionListener { 

    private static final String TAG = SCWelcomeActivity.class.getSimpleName(); 

    private ViewPager viewPager = null; 
    private TabLayout tabLayout = null; 
    private Toolbar toolbar = null; 
    private SCFragmentPagerAdapter adapter = null; 

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

     // Layout manager that allows the user to flip through the pages 
     viewPager = (ViewPager) findViewById(R.id.viewpager); 
     setupViewPager(viewPager); 

     // Initialize the Sliding Tab Layout 
     tabLayout = (TabLayout) findViewById(R.id.tablayout); 

     // Connect the viewPager with the sliding tab layout 
     tabLayout.setupWithViewPager(viewPager); 
     tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    public void onFragmentInteraction(Uri uri) { 

    } 


    private void setupViewPager(ViewPager viewPager) { 

     adapter = new SCFragmentPagerAdapter(getSupportFragmentManager(), SCWelcomeActivity.this); 
     adapter.addFragment(SCWelcomeFragment.newInstance(), getString(R.string.title_tab1)); 
     adapter.addFragment(SCSyncFragment.newInstance(), getString(R.string.title_tab2)); 
     adapter.addFragment(SCRegisterFragment.newInstance(), getString(R.string.title_tab3)); 
     adapter.addFragment(SCConfirmationFragment.newInstance(), getString(R.string.title_tab4)); 


     viewPager.setAdapter(adapter); 
     viewPager.setOffscreenPageLimit(4); 
    } 

    public interface OnFragmentInteractionListener { 
     // TODO: Update argument type and name 
     public void onFragmentInteraction(Uri uri); 
    } 
} 

Frammento Esempio:

public class SCWelcomeFragment extends Fragment { 

    private OnFragmentInteractionListener mListener; 

    public static SCWelcomeFragment newInstance() { 
     SCWelcomeFragment fragment = new SCWelcomeFragment(); 
     return fragment; 
    } 

    public SCWelcomeFragment() { 
     super(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_scwelcome, container, false); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mListener = (OnFragmentInteractionListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    public interface OnFragmentInteractionListener { 
     // TODO: Update argument type and name 
     public void onFragmentInteraction(Uri uri); 
    } 
} 

Disposizione:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/coordinator" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="130dp" 
     android:fitsSystemWindows="true" 
     android:gravity="bottom" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      app:layout_collapseMode="pin" 
      android:layout_gravity="center" 
      android:theme="@style/ThemeOverlay.AppCompat.Dark" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tablayout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 


    </android.support.design.widget.AppBarLayout> 


</android.support.design.widget.CoordinatorLayout> 

Si prega di provare a implementare l'adattatore come faccio io. Presta particolare attenzione al fatto che nel mio Adattatore tutte le istanze vengono salvate nello

private final List<Fragment> mFragments = new ArrayList<>(); 

Nel tuo caso restituisci sempre una nuova istanza. Ecco perché impostare setOffscreenPageLimit (4). a 4 quindi sono tenuti in memoria pure.

0

devo variante più breve per risolvere questo bug (disegno supporto Android lib v.23.0.0):

... 
//initialize views 
    mViewPager.setAdapter(pagerAdapter); 
    mTabLayout.setupWithViewPager(mViewPager); 
    mViewPager.clearOnPageChangeListeners(); 
    mViewPager.addOnPageChangeListener(new WorkaroundTabLayoutOnPageChangeListener(mTabLayout)); 
... 

e Classe WorkaroundTabLayoutOnPageChangeListener:

public class WorkaroundTabLayoutOnPageChangeListener extends TabLayout.TabLayoutOnPageChangeListener { 
    private final WeakReference<TabLayout> mTabLayoutRef; 

    public WorkaroundTabLayoutOnPageChangeListener(TabLayout tabLayout) { 
     super(tabLayout); 
     this.mTabLayoutRef = new WeakReference<>(tabLayout); 
    } 

    @Override 
    public void onPageSelected(int position) { 
     super.onPageSelected(position); 
     final TabLayout tabLayout = mTabLayoutRef.get(); 
     if (tabLayout != null) { 
      final TabLayout.Tab tab = tabLayout.getTabAt(position); 
      if (tab != null) { 
       tab.select(); 
      } 
     } 
    } 
} 
4

Nella vostra attività, dopo trovare viste Di Id, dovresti "configurare" ViewPager e TabLayout. Alcune caratteristiche necessarie forse: "addOnPageChangeListener" per ViewPager e "setOnTabSelectedListener" per il vostro TabLayout come questo:

public class MainActivity extends AppCompatActivity { 

private final int numOfPages = 4; //viewpager has 4 pages 
private final String[] pageTitle = {"Food", "Movie", "Shopping", "Travel"}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 

    for (int i = 0; i < numOfPages; i++) { 
     tabLayout.addTab(tabLayout.newTab().setText(pageTitle[i])); 
    } 

    //set gravity for tab bar 
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

    final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); 
    final PagerAdapter adapter = new PagerAdapter 
      (getSupportFragmentManager(), numOfPages); 

    viewPager.setAdapter(adapter); 
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
    tabLayout.setOnTabSelectedListener(onTabSelectedListener(viewPager)); 
} 

private TabLayout.OnTabSelectedListener onTabSelectedListener(final ViewPager pager) { 
    return new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      pager.setCurrentItem(tab.getPosition()); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 

     } 
    }; 
} 

Ho un post tutorial su questo e funziona bene! Non c'è errore come il tuo. Spero che aiuti: http://www.devexchanges.info/2015/08/android-material-design-viewpager-with.html

+0

Esercitazione fantastica. Ha senso. Grazie per la risposta. Questa dovrebbe essere la risposta in uscita – Chandru

2

Nessuna delle risposte di cui sopra ha funzionato per me a partire da fine 2016 il bug esiste ancora nel design libreria di supporto 24+. sono stato in grado di risolvere questo problema avvolgendo il layout di scheda all'interno di un layout
coordinatore

+0

ore trascorse .. questo ha risolto il problema .. e il problema con la libreria di supporto 24+ esiste ancora .. – Moulesh

Problemi correlati