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);
}
}
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 –