0

Ich rufe den Camera Intent in einem verschachtelten Fragment auf und erhalte das Image in onActivityResult im Fragment ohne Probleme. Da ich das Bild zuschneiden möchte, rufe ich eine (zweite) Absicht in onActivityResult auf, um das Bild an den Crop Intent zu übergeben. Das onActivityResult wird in diesem Fall jedoch nicht aufgerufen (Nur relevant, wenn die Anwendung während einer der Absichten im Hintergrund beendet wird).Aufruf des zweiten Intents in onActivityResult des verschachtelten Fragments ruft onActivityResult nicht erneut auf

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 
    switch (requestCode) { 

     // Camera onActivityResult 
     case INTENT_CAMERA: 
      Toast.makeText(getActivity(), "IN CARD ONACTIVITY - CAMERA INTENT", Toast.LENGTH_LONG).show(); 
      if (resultCode == RESULT_OK) { 

       SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
       String uriString = getPrefs.getString("photoUri", null); 
       if (uriString != null) { 

        Uri selectedImage = Uri.parse(uriString); 

        Intent intent = CropImage.activity(selectedImage).setAspectRatio(1, 1).setMinCropResultSize(800, 800).getIntent(getContext()); 
        startActivityForResult(intent, INTENT_CROP); 

       } else { 
        Toast.makeText(getActivity(), "ERROR", Toast.LENGTH_LONG).show(); 
       } 

      } 
      break; 

     // Crop ActivityOnResult 
     case INTENT_CROP: 
      Toast.makeText(getActivity(), "IN CARD ONACTIVITY - CROP INTENT", Toast.LENGTH_LONG).show(); 

      CropImage.ActivityResult result = CropImage.getActivityResult(imageReturnedIntent); 
      if (resultCode == RESULT_OK) { 
       Uri resultUri = result.getUri(); 
       try { 
        bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), resultUri); 
        uploadImage(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

      } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) { 
       Exception error = result.getError(); 
      } 
    } 
} 

fand ich die folgende Zeile in den Protokollen:

W/FragmentActivity: Activity result no fragment exists for who: android:fragment:0:1 

Diese nur ausgelöst wird, wenn die Ernte Absicht genannt wird - nicht für die erste Kamera Absicht. Muss ich warten, bis das Fragment erneut erstellt wurde, bevor ich die zweite Absicht anrufe? Oder gibt es einen anderen zuverlässigen Weg, um mit dieser Situation umzugehen? Vielen Dank!

Aktivität Code:

public class MainActivity extends AppCompatActivity { 

// Nav Drawer Variables 
private DrawerLayout mDrawer; 
private Toolbar toolbar; 
private NavigationView nvDrawer; 
private ActionBarDrawerToggle drawerToggle; 

private PrefManager prefManager; 

FragmentManager fragmentManager = getSupportFragmentManager(); 
Fragment fragment = null; 
FragmentTransaction transaction; 
String FRAGMENT_TAG; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 


    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    prefManager = new PrefManager(this); 


    // Set a Toolbar to replace the ActionBar. 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    // Set navigation view 
    NavigationView navigationView = (NavigationView) findViewById(R.id.nvView); 
    View v = navigationView.getHeaderView(0); 

    // Find drawer view 
    mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawerToggle = setupDrawerToggle(); 

    // Tie DrawerLayout events to the ActionBarToggle 
    mDrawer.addDrawerListener(drawerToggle); 

    // Find drawer view 
    nvDrawer = (NavigationView) findViewById(R.id.nvView); 
    // Setup drawer view 
    setupDrawerContent(nvDrawer); 


    //Set Progress Bar Invisible 
    FrameLayout progressFrame = (FrameLayout) findViewById(R.id.progressFrame); 
    progressFrame.setVisibility(View.GONE); 



    // Switch between hamburger and back button 
    getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true); // show back button 
       toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         onBackPressed(); 
        } 
       }); 
      } else { 
       //show hamburger 
       getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
       drawerToggle.syncState(); 
       toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         mDrawer.openDrawer(GravityCompat.START); 
        } 
       }); 
      } 
     } 
    }); 

    // Handle Fragments 
    if (savedInstanceState != null) { 

     fragment = fragmentManager.getFragment(savedInstanceState, "fragment"); 
     transaction = fragmentManager.beginTransaction(); 
     transaction.replace(R.id.flContent, fragment, FRAGMENT_TAG).commit(); 
    } else { 
     // Insert the inital fragment 
     Class fragmentClass = Fragment1.class; 
     FRAGMENT_TAG = "FRAGMENT_1"; 
     try { 
      fragment = (Fragment) fragmentClass.newInstance(); 

      transaction = fragmentManager.beginTransaction(); 
      transaction.replace(R.id.flContent, fragment, FRAGMENT_TAG).commit(); 
     } catch (InstantiationException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    } 

} 


private ActionBarDrawerToggle setupDrawerToggle() { 
    return new ActionBarDrawerToggle(this, mDrawer, toolbar, R.string.drawer_open, R.string.drawer_close); 
} 

private void setupDrawerContent(NavigationView navigationView) { 
    navigationView.setNavigationItemSelectedListener(
      new NavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(MenuItem menuItem) { 
        selectDrawerItem(menuItem); 
        return true; 
       } 
      }); 
} 

public void selectDrawerItem(MenuItem menuItem) { 
    // Create a new fragment and specify the fragment to show based on nav item clicked 

    Class fragmentClass = null; 
    switch (menuItem.getItemId()) { 
     case R.id.nav_home: 
      FRAGMENT_TAG = "FRAGMENT_1"; 
      fragmentClass = Fragment1.class; 
      break; 
     case R.id.nav_mychallenges: 
      FRAGMENT_TAG = "FRAGMENT_2"; 
      fragmentClass = Fragment2.class; 
      break; 
     case R.id.nav_feedback: 
      FRAGMENT_TAG = "FRAGMENT_3"; 
      fragmentClass = Fragment3.class; 
      break; 
     default: 
FRAGMENT_TAG = "FRAGMENT_1"; 
      fragmentClass = Fragment1.class; 
    } 
    try { 
     fragment = (Fragment) fragmentClass.newInstance(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    // Insert the fragment by replacing any existing fragment 

    transaction = fragmentManager.beginTransaction(); 
    //transaction.addToBackStack(null); 
    transaction.replace(R.id.flContent, fragment, FRAGMENT_TAG).commit(); 

    // Highlight the selected item has been done by NavigationView 
    menuItem.setChecked(true); 
    // Set action bar title 
    setTitle(menuItem.getTitle()); 
    // Close the navigation drawer 
    mDrawer.closeDrawers(); 
} 

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     super.onBackPressed(); 
    } 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (drawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 


// `onPostCreate` called when activity start-up is complete after `onStart()` 
// NOTE! Make sure to override the method with only a single `Bundle` argument 
@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    // Sync the toggle state after onRestoreInstanceState has occurred. 
    drawerToggle.syncState(); 

} 


@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    // Pass any configuration change to the drawer toggles 
    drawerToggle.onConfigurationChanged(newConfig); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
} 

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

    fragmentManager.putFragment(outState, "fragment", fragmentManager.findFragmentById(R.id.flContent)); 
    Log.d("TAG", "CURRENT_FRAGMENT: " + fragmentManager.findFragmentById(R.id.flContent)); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
} 

} 

EDIT:

ParentFragment:

public class FragmentProcess extends Fragment { 


Fragment childFragment; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 



    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_process, container, false); 
    TextView processTitle = (TextView) view.findViewById(R.id.title); 
    processTitle.setText("Title"); 
    return view; 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    loadData(); 
} 

private void loadData() { 


     String url = "example.com "; 
     // Instantiate the RequestQueue. 
     // RequestQueue queue = Volley.newRequestQueue(getActivity().getApplicationContext()); 

     // Request a string response from the provided URL. 
     StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       // Display the first 500 characters of the response string. 
       subChallengesString = response; 

       insertNestedFragment(); 


      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 

      } 
     }); 
     MySingleton.getInstance(getActivity()).addToRequestQueue(stringRequest); 


} 

// Embeds the child fragment dynamically 
private void insertNestedFragment() { 



    childFragment = new FragmentProcessChallengeCard(); 
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 
    transaction.replace(R.id.process_challenge_child_fragment, childFragment).commit(); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    //Save the fragment's state here 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    } 
} 
+0

Können Sie Ihren Aktivitätscode angeben? –

+0

@JayminPanchal Ich habe den Aktivitätscode über – mojo

+0

hinzugefügt Sind Sie sicher, dass Sie den cropImage Intent richtig aufrufen? –

Antwort

0

Die Bibliothek, die Sie verwenden, hat geschrieben, dass onActivityResult-Methode der übergeordneten Aktivität aufgerufen wird. Überprüfen Sie Ihre onActivityResult of Parent Activity und erstellen Sie eine Methode oder Schnittstelle, um dasselbe Ergebnis an Ihr Fragment zu senden.

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) { 
    CropImage.ActivityResult result = CropImage.getActivityResult(data); 
    if (resultCode == RESULT_OK) { 
     Uri resultUri = result.getUri(); 
    } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) { 
     Exception error = result.getError(); 
    } 
} 
0

Sie müssen die Aktivität resultieren aus Ihrer Aktivität Fragment zu übergeben.

Versuchen Sie einfach diesen Code in Ihrem activity und überprüfen Sie, ob es funktioniert oder nicht.

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.flContent); 
    fragment.onActivityResult(requestCode, resultCode, data); 
} 
+0

Auf diese Weise wird die onActivityResult() im Kind-Fragment überhaupt nicht aufgerufen. Nicht einmal zum ersten Mal für die Kamera Absicht .. Ich werde etwas Code aus dem Elternteil Fragment in meiner Antwort hinzufügen. Vielleicht hilft das, das Problem zu verstehen. – mojo

Verwandte Themen