tutorial - Android Fragment and Dependency Injection
xamarin samples (3)
Una solución simple es declarar una interfaz que declara las Dependencias requeridas para el Fragmento. Luego, permita que el Contexto del Fragmento implemente esta interfaz, y consulte las dependencias cuando sea necesario desde el Contexto.
Contrato:
public interface MyDependencies {
MyDep getDep();
}
Actividad:
public MyActivity extends Activity implements MyDependencies {
@Override
public MyDep getDep(){
return createMyDependencyOrGetItFromASingletonOrGetItFromApplication()
}
}
Fragmento:
public void onActivityCreated(Bundle b){
super.onActivityCreated(b)
if (getActivity() instanceOf MyDependencies) {
MyDep dep = ((MyDependencies) getActivity).getDep();
} else {
throw new RuntimeException("Context does not support the Fragment, implement MyDependencies")
}
}
Entonces, de hecho, no hay un acoplamiento innecesario a la Actividad porque el contrato está definido por una interfaz.
como dice el título, estoy tratando de averiguar cuál es la mejor forma de inyectar una dependencia en un Fragmento. Quiero ser independiente de frameworks externos como RoboGuice, etc.
Ahora, de la manera más simple posible, tengo una interfaz que abstrae algún tipo de lógica y, desde una Actividad, quiero inyectar una implementación de esta interfaz. Sé que tengo que proporcionar un constructor predeterminado para mi fragmento, ya que el sistema podría necesitar recrear el fragmento en algún momento, y que la forma habitual de crear una nueva instancia del fragmento es proporcionar un método estático que maneje la creación como esta:
public static Fragment newInstance() {
final Bundle bundle = new Bundle();
...
final Fragment fragment = new MyFragment();
fragment.setArguments(bundle);
return fragment;
}
¿Cómo puedo pasar mi dependencia al fragmento? ¿Debo hacer que implemente las interfaces Parcelable o Serializable y luego empacarlo en el Bundle? ¿Hay alguna otra manera de lograr el resultado?
¡Gracias!
¿Por qué no tomas la dependencia de tu actividad?
public void onActivityCreated( Bundle b){
super.onActivityCreated(b)
DependencyClass c = ((MyActivity)getActivity()).getDependency();
}
Si no puede pasar la dependencia a través del constructor (si necesita un constructor predeterminado), y no desea usar una inyección de inyección de dependencias como Dagger o RoboGuice, la otra forma clásica es que un instalador "inyecte" la dependencia
Fragment MyFragment {
Depend mDepend;
....
public void setDepend(Depend depend) {
mDepend = depend;
}
}
Luego, en su actividad puede inyectar la dependencia en el método onCreate.
algo así en tu actividad:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
MapFragment wrapperFragment = new WrapperFragment();
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.map_container, wrapperFragment).commit();
// find the fragment
// call the setter
}
}