2016-06-11 3 views
1

Zuerst. Entschuldigung für mein Englisch.Meine fragmentClass bekommen falsche Seite von ViewPager in medod onContextItemSelected

Ich habe Aktivitätsklasse mit ViewPager als ein Feld und eine Fragment Klasse. Meine Aktivität ist ein Host für ein Fragment. In Fragment möchte ich das für ImageView registrierte Kontextmenü aufrufen. Dafür überschreibe ich 2 Methoden: onCreateContextMenu und onContextItemSelected.

Problem ist:

  • Wenn onCreateContextMenu genannt wird ich die richtige Seite zu bekommen (das auf dem Bildschirm jetzt).
  • Aber wenn onContextItemSelected aufgerufen wird, bekomme ich eine andere Seite (diese hängt davon ab, welcher Parameter in ViewPager.setOffscopePageLimit (int) gesetzt ist). Wenn es beispielsweise 3 ist, ist die zurückgegebene Seite diejenige, die an 3 Stellen nach links oder rechts von der aktuellen auf dem Bildschirm ist.

Wie kann ich es beheben?

Vielen Dank.

Aktivität Code

public class CrimePagerActivity extends FragmentActivity { 
    private ViewPager mViewPager; 
    private ArrayList<Crime> mCrimes; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     mViewPager = new ViewPager(this); 
     mViewPager.setId(R.id.viewPager); 
     setContentView(mViewPager); 

     mCrimes = CrimeLab.get(this).getCrimes(); 

     mViewPager.setOffscreenPageLimit(4); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
      mViewPager.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); 
     } 
     FragmentManager fm = getSupportFragmentManager(); 
     mViewPager.setAdapter(new FragmentStatePagerAdapter(fm) { 
      @Override 
      public Fragment getItem(int position) { 
       Crime crime = mCrimes.get(position); 
       return CrimeFragment.newInstance(crime.getId()); 
      } 

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

     UUID crimeId = (UUID) getIntent().getSerializableExtra(CrimeFragment.EXTRA_CRIME_ID); 
     for (int i = 0; i< mCrimes.size(); i++){ 
      if (mCrimes.get(i).getId().equals(crimeId)){ 
       mViewPager.setCurrentItem(i); 
       break; 
      } 
     } 
    } 
} 

und Codefragment

public class CrimeFragment extends Fragment { 
    ....... 
    private ImageView mPhotoView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     ........ 
     View v = inflater.inflate(R.layout.fragment_crime, container, false); 
     mPhotoView = (ImageView) v.findViewById(R.id.crime_imageView); 
     registerForContextMenu(mPhotoView); 
     return v; 
    } 

......... 

@Override 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
     Log.i(TAG, mCrime.getTitle()); 
     switch (v.getId()) { 
      case R.id.crime_imageView: 
       if (mCrime.getPhoto() != null) 
        getActivity().getMenuInflater().inflate(R.menu.crime_photo_context, menu); 
       break; 
     } 
    } 


    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     Log.i(TAG, mCrime.getTitle()); 

     switch (item.getItemId()) { 
      case R.id.menu_item_delete_photo: 
       getActivity().deleteFile(mCrime.getPhoto().getFilename()); 
       PictureUtils.cleanImageView(mPhotoView); 
       mCrime.setPhoto(null); 
       return true; 
     } 
     return super.onContextItemSelected(item); 
    } 
} 
+0

Sie sollten einen ViewPager.OnPageChangedListener verwenden und in das aktuelle Fragment aufrufen, um 'registerForContextMenu()' jedes Mal aufzurufen, wenn der Benutzer zu diesem Fragment wischt (den Aufruf von 'onCreateView()' entfernen). Sehen Sie hier ein Beispiel für diesen Ansatz: http://stackoverflow.com/a/36504458/4409409 –

Antwort

0
ViewPager.setOffscreenPageLimit(int); 

Diese Seiten auf beiden Seiten nach links und rechts (Nachbarn) vorbereiten.

Standardmäßig ist es 1.

in Ihrem Fall also das aktuelle Fragment durch den viewPager erstellt zu bekommen.

können die Fragmente speichern, wenn in einer SparseArray durch Überschreiben der instantiateItem() und destroyItem() Rückruf von viewPager mit Position erstellt.

private SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>(); 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    Fragment fragment = (Fragment) super.instantiateItem(container, position); 
    registeredFragments.put(position, fragment); 
    return fragment; 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    registeredFragments.remove(position); 
    super.destroyItem(container, position, object); 
} 


public Fragment getFragment(int position) { 
    return registeredFragments.get(position); 
} 

Und wo Sie das aktuelle Fragment erhalten möchten, bekommen sie durch die getFragment() Methode verwendet wird, indem die Position vorbei.

+0

Ich weiß es. Die Frage ist, wie ViewPager die aktuelle Seite (keine Nachbarn) in meiner Fragment-Klassenmethode onContextItemSelected() zurückgeben kann. –

+0

OK, überprüfe meine aktualisierte Antwort. – Ritesh

Verwandte Themen