@@ -333,6 +333,10 @@ private void addIntentBuilder(JCodeModel codeModel, EBeanHolder holder, boolean
333333 constructorBody .assign (contextField , constructorContextParam );
334334 constructorBody .assign (holder .intentField , _new (intentClass ).arg (constructorContextParam ).arg (holder .generatedClass .dotclass ()));
335335 }
336+ // Additional constructor for fragments (issue #541)
337+ JFieldVar fragmentField =
338+ addIntentBuilderFragmentConstructor ( holder , holder .classes ().FRAGMENT , "fragment_" , contextField );
339+ JFieldVar fragmentSupportField = addIntentBuilderFragmentConstructor ( holder , holder .classes ().SUPPORT_V4_FRAGMENT , "fragmentSupport_" , contextField );
336340
337341 {
338342 // get()
@@ -360,11 +364,31 @@ private void addIntentBuilder(JCodeModel codeModel, EBeanHolder holder, boolean
360364
361365 JBlock body = method .body ();
362366 JClass activityClass = holder .classes ().ACTIVITY ;
363- JConditional condition = body ._if (contextField ._instanceof (activityClass ));
364- condition ._then () //
365- .invoke (JExpr .cast (activityClass , contextField ), "startActivityForResult" ).arg (holder .intentField ).arg (requestCode );
366- condition ._else () //
367- .invoke (contextField , "startActivity" ).arg (holder .intentField );
367+
368+ JConditional condition = null ;
369+ if (fragmentSupportField != null ) {
370+ condition = body ._if (fragmentSupportField .ne (JExpr ._null ()));
371+ condition ._then () //
372+ .invoke ( fragmentSupportField , "startActivityForResult" ).arg (holder .intentField ).arg (requestCode );
373+ }
374+ if (fragmentField != null ) {
375+ if (condition == null ){
376+ condition =body ._if (fragmentField .ne (JExpr ._null ()));
377+ } else {
378+ condition = condition ._elseif (fragmentField .ne (JExpr ._null ()));
379+ }
380+ condition ._then () //
381+ .invoke (fragmentField , "startActivityForResult" ).arg (holder .intentField ).arg (requestCode );
382+ }
383+ if (condition == null ) {
384+ condition =body ._if (contextField ._instanceof (activityClass ));
385+ } else {
386+ condition = condition ._elseif (contextField ._instanceof (activityClass ));
387+ }
388+ condition ._then () //
389+ .invoke (JExpr .cast (activityClass , contextField ), "startActivityForResult" ).arg (holder .intentField ).arg (requestCode );
390+ condition ._else () //
391+ .invoke (contextField , "startActivity" ).arg (holder .intentField );
368392 } else {
369393 // start()
370394 JMethod method = holder .intentBuilderClass .method (PUBLIC , holder .classes ().COMPONENT_NAME , "start" );
@@ -383,4 +407,22 @@ private void addIntentBuilder(JCodeModel codeModel, EBeanHolder holder, boolean
383407 }
384408 }
385409 }
410+
411+ private JFieldVar addIntentBuilderFragmentConstructor (EBeanHolder holder , JClass fragmentClass , String fieldName , JFieldVar contextField ) {
412+
413+ try {
414+ Class .forName ( fragmentClass .fullName (), false , getClass ().getClassLoader () );
415+ } catch ( ClassNotFoundException e ){
416+ // do nothing if the class is not in the classpath
417+ return null ;
418+ }
419+ JFieldVar fragmentField = holder .intentBuilderClass .field (PRIVATE , fragmentClass , fieldName );
420+ JMethod constructor = holder .intentBuilderClass .constructor (JMod .PUBLIC );
421+ JVar constructorFragmentParam = constructor .param (fragmentClass , "fragment" );
422+ JBlock constructorBody = constructor .body ();
423+ constructorBody .assign (fragmentField , constructorFragmentParam );
424+ constructorBody .assign (contextField , constructorFragmentParam .invoke ( "getActivity" ));
425+ constructorBody .assign (holder .intentField , _new (holder .classes ().INTENT ).arg (contextField ).arg (holder .generatedClass .dotclass ()));
426+ return fragmentField ;
427+ }
386428}
0 commit comments