2016-08-09 15 views
0

Ich verwende derzeit eine Viewpager Implementierung in meiner Android App. In jedem Fragment befindet sich eine Schaltfläche, die ein Foto aufnimmt und es in eine Online-Datenbank hochlädt. Aufgrund der neuen Berechtigungsanforderungen musste ich jedoch um Erlaubnis bitten. Daher müsste ich den onRequestPermissionsResult() verwenden, um den Upload fortzusetzen.Viewpager rastet nach dem Fotografieren auf der falschen Seite ein

Unten ist meine Implementierung

dies vom ViewPager.class (Da nach Genehmigung erteilt wird, diese Methode in der Viewpager anstelle des einen in das Fragment genannt wird)

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_TAKE_PHOTO: 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       //Permission granted to write and read file 
       //Get the current fragment 
       List<Fragment> fragments = getSupportFragmentManager().getFragments(); 
       for (Fragment currFragment : fragments) { 
        if (currFragment != null) 
         currFragment.onRequestPermissionsResult(
           REQUEST_TAKE_PHOTO 
           , permissions 
           , grantResults); 
       } 
      } 
      return; 
     default: //Do nothing 
      return; 
    } 
} 

diese wird aus dem Fragment selbst

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_TAKE_PHOTO: 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       //Permission granted to write and read file 
       uploadImage(); 
      } 
      return; 
     default: //Do nothing 
      return; 
    } 
} 

diese Teil

List<Fragment> fragments = getSupportFragmentManager().getFragments(); 
        for (Fragment currFragment : fragments) { 
         if (currFragment != null) 
          currFragment.onRequestPermissionsResult(
            REQUEST_TAKE_PHOTO 
            , permissions 
            , grantResults); 
        } 

ist mein Versuch, das korrekte Fragment zu finden, die auf die Schaltfläche geklickt und rufen Sie die OnRequestPermissionResult() Methode.

Allerdings bemerke ich dieses seltsame Verhalten von Viewpager. Die Art, wie ich es implementiert habe, ist, dass ich auf einen Viewholder von einem RecyclerView klicke, der dann diese Position im ViewPager eingibt.

Das seltsame Verhalten ist, dass zum Beispiel Seite 2 von der RecyclerView eingegeben. Dann wische ich auf Seite 4 und klicke auf die Schaltfläche Foto hochladen, nachdem das Foto fertig ist (über die integrierte Kamera-App), wird auf Seite 2 zurückgeschaltet.

Warum ist das? Wie repariere ich es? Entschuldigung für einen längeren Post. Ich versuche nur, so viele Informationen da draußen zu bekommen. Dank

EDIT: Das ist, wie ich die requestPermission nennen

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode != Activity.RESULT_OK) { 
     return; 
    } 
    if (requestCode == REQUEST_TAKE_PHOTO) { 
     //Request for permission to access file 
     if (ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
      //ask for permission 
      ActivityCompat.requestPermissions(getActivity(), new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
        REQUEST_TAKE_PHOTO); 
     } else { 
      uploadImage(); 
     } 
    } 
} 

Stimmt etwas nicht?

Edit Post: Dies ist der Teil, wo ich die notifyDataSetChange genannt()

private void loadData() { 
    mRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      ArrayList<RouteInstructions> mList2 = new ArrayList<RouteInstructions>(); 

      for (DataSnapshot instructions : dataSnapshot.getChildren()) { 
       mList2.add(instructions.getValue(RouteInstructions.class)); 
      } 
      mList = mList2; 
      mAdapter.notifyDataSetChanged(); 
      mPager.setCurrentItem(getIntent().getIntExtra(EXTRA_INDEX, 0)); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 
+0

Woran denken Sie, dass der von Ihnen gepostete Code für Ihr Problem relevant ist? Sollten Sie uns nicht zeigen, wie Sie Ihre Fragmentliste manipulieren? – kalabalik

+0

Wie rufen Sie requestPermission auf? Nach diesem Beitrag http://StackOverflow.com/Questions/33169455/onrequestpermissionsresult-not-being-in-dialog-fragment können Sie sehen, dass, wenn Sie die Support-Bibliothek aufrufen, es direkt auf Ihr Fragment verweist .. Ist das eine Lösung für dich? – Cata

+0

@KalaBalik Was meinst du damit, wie ich Fragmente Liste manipuliere?Beziehen Sie sich auf den getItem() und den getCount() in meinem FragmentStatePagerAdapter-Teil? – Bosen

Antwort

0

ich den Fehler gefunden zu haben. Im Grunde genommen habe ich den Fehler gemacht, die Methode loadData() in die onResume() -Methode zu setzen und damit die Viewpager-Seite auf diejenige zurückzusetzen, die sie von diesem Extra erhalten hat.

Verwandte Themen