Poignard pour Android: Injection d'une Activité à l'objet graphique après l'appel de setContentView

Je veux utiliser la Dague sur Android pour injecter une instance d'un Activity dans une autre classe comme suit:

class PresentationLayer{
    Activity mActivity;

    @Inject
    public PresentationLayer(Activity activity){
        this.mActivity = activity;
    }

    public void presentData(User user){
        ((TextView)mActivity.findViewById(R.id.username))
            .setText(user.getName());
        //...
        //...
    }
}

Je suis en mesure de faire l'injection, mais tous les domaines de la Activity sont null au moment de l'injection.

Voici comment j'ai fais l'injection:

Mon Activity est un module en lui-même.

@Module(
    complete = false
)
class MainActivity extends Activity{

    @Override
    public void onCreate(Bundle bundle){
        super.onCreate(bundle);
        setContentView(R.layout.main_activity);
        ObjectGraph objectGraph = CustomApplication.getObjectGraph();
        PresentationLayer pres = objectGraph.get(PresentationLayer.class);
    }

    @Provides Activity provideActivity(){
        return this;
    }


}

C'est mon module principal

@Module(
    entryPoints = PresentationLayer.class,
    includes = MainActivity.class
)
class DaggerModule{
    @Provides PresentationLayer providePresentation(Activity activity){
        return new PresentationLayer(activity);
    }
}

Et mon Application classe qui amorce le graphe d'objets.

class CustomApplication extends Application{

    private static ObjectGraph sObjectGraph;
    @Override
    public void onCreate(){
        sObjectGraph = ObjectGraph.create(new DaggerModule());
    }

    static getObjectGraph(){
        return sObjectGraph;
    }
}

Je suis à la recherche d'un moyen d'exécuter explicitement l'injection après j'appelle setContentView.

Comment dois-je faire?


EDIT 1:

Je l'ai eu à travailler comme ça - mais je ne suis pas sûr si c'est le "droit chemin". Ce que je fais est

  1. Passer de l'Activité pour l' Module constructeur
  2. Assurer que je construis la ObjectGraph après je ne setContentView() de sorte qu'un bon Activity instance est transmise à la ObjectGraph.

Mon Activity n'est plus un poignard Module.

Cela se traduit par les éléments suivants dans le code:

@Module(
    entryPoints = PresentationLayer.class
)
class DaggerModule{

    private Activity mActivity;

    public DaggerModule (Activity activity){
        this.mActivity = activity;
    }

    @Provides PresentationLayer providePresentation(){
        return new PresentationLayer(mActivity);
    }
}

Et c'est ainsi que ma Activity ressemble:

class MainActivity extends Activity{

    @Override
    public void onCreate(Bundle bundle){
        super.onCreate(bundle);
        setContentView(R.layout.main_activity);
        ObjectGraph objectGraph = CustomApplication.getObjectGraph(this);
        PresentationLayer pres = objectGraph.get(PresentationLayer.class);
        User user = //get the user here
        pres.presentData(user);
    }
}

Cette solution semble répondre aux points soulevés par Jesse Wilson dans cette réponse. Cependant, je suis préoccupé par la performance, car le ObjectGraph va être construit chaque fois que le Activity est créé.

Toutes les pensées?

OriginalL'auteur curioustechizen | 2012-12-21