5

Questo problema riguarda solo il lecca-lecca. kitkat e le versioni precedenti funzionano correttamente!viewpager non funziona correttamente in lollipop 5.0 quando utilizzo altri frammenti

Il problema è che ho implementato uno slider utilizzando una visualizzazione di pagina, nel primo frammento ho il frammento di login con due pulsanti.

All'avvio dell'app non c'è un problema, ma quando cambio il frammento usando la vista della pagina e di nuovo il frammento di login, i pulsanti non funzionano.

I pulsanti caricano il modulo di registrazione o il modulo di accesso nello stesso frammento. Non c'è un errore, solo il pulsante non fa nulla.

Questo è il codice: il codice

public class ScreenSlideActivity extends ActionBarActivity { 
    /** 
    * The number of pages (wizard steps) to show in this demo. 
    */ 
    private static final int NUM_PAGES = 5; 

    /** 
    * The pager widget, which handles animation and allows swiping horizontally to access previous 
    * and next wizard steps. 
    */ 
    private ViewPager mPager; 

    /** 
    * The pager adapter, which provides the pages to the view pager widget. 
    */ 
    private PagerAdapter mPagerAdapter; 

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

     // Instantiate a ViewPager and a PagerAdapter. 
     /*postponeEnterTransition(); 
     mPager.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 

      public boolean onPreDraw() { 
       mPager.getViewTreeObserver().removeOnPreDrawListener(this); 
       startPostponedEnterTransition(); 
       return true; 
      } 
     });*/ 
     mPager = (ViewPager) findViewById(R.id.pager); 
     mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); 
     mPager.setAdapter(mPagerAdapter); 
     mPager.setPageTransformer(true, new DepthPageTransformer()); 
     LinePageIndicator indicator = (LinePageIndicator) findViewById(R.id.indicator); 
     indicator.setViewPager(mPager); 
    } 

    @Override 
    public void onBackPressed() { 
     if (mPager.getCurrentItem() == 0) { 
      // If the user is currently looking at the first step, allow the system to handle the 
      // Back button. This calls finish() on this activity and pops the back stack. 
      super.onBackPressed(); 
     } else { 
      // Otherwise, select the previous step. 
      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 Fragment getItem(int position) { 
      switch(position) 
      { 
       case 0: 
        return new LoginSignupFragment(); 
       default: 
        return new SlidePageFragment(); 
      } 
     } 

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

} 

Il primo frammento di caricare il modulo di login o registrati forma è:

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

    ingresarBtn = (Button) rootView.findViewById(R.id.ingresarBtn); 
    ingresarBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Fragment frag = new LoginFragment(); 
      FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
      transaction.replace(R.id.slide_login_content, frag); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
     } 
    }); 
    unirseBtn = (Button) rootView.findViewById(R.id.unirseBtn); 
    unirseBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Fragment frag = new SignupFragment(); 
      FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
      transaction.replace(R.id.slide_login_content, frag); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
     } 
    }); 
    return rootView; 
} 

Se è necessario ulteriori informazioni, darò.

risposta

5

Ho avuto lo stesso problema con il mio ViewPager. Ho cercato spesso su Google ma non ho trovato alcuna soluzione. Poi mi sono ricordato di impostare android:hardwareAccelerated="false" nel manifest della mia domanda.

Rimuovere la riga android:hardwareAccelerated="false" dal manifest ha fatto il trucco. Sembra che avere questa linea nel file manifest faccia sì che i pulsanti e le visualizzazioni di testo utilizzate all'interno di un ViewPager non funzionino correttamente per il lollipop di Android.

Quindi se hai android:hardwareAccelerated="false" nel file manifest prova a rimuoverlo. Oppure puoi anche provare a impostare android:hardwareAccelerated="true" per lo specifico <activity> o per il tag <application>.

Come indicato qui https://stackoverflow.com/a/10339406/3090861, l'attributo verrà ignorato nelle versioni precedenti di Android.

È possibile trovare ulteriori informazioni sull'accelerazione hardware a http://android-developers.blogspot.in/2011/03/android-30-hardware-acceleration.html.

Spero che ti aiuti!