MyFragment
MyNestedFragment
bağlıdır ve MyNestedFragment
Deps
bağlıdır ise; Bu, MyFragment
'un da Deps
'a bağlı olduğunu izler. Tabii ki, Activity.onAttachFragment()
çağrıldığında, MyNestedFragment
'un hiçbir örneği yoktur, bu nedenle'daki düzeni, bağımlılıkları ile birlikte MyNestedFragment
ürününü göndermeden önce beklemeniz gerekir. Tüm bu biraz dağınık görünüyorsa fragmanlar sadece bazı keyfi bir şekilde yukarı bağlayabilirsiniz POJOs olmadıklarından
public class MyActivity {
...
void onAttachFragment(Fragment f){
((MyFragment)f).dependencies(deps);
}
public static class MyFragment extends Fragment {
private Deps deps;
void dependencies(Deps deps) {
this.deps = deps;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
// <fragment> element in fragment_main layout has
// android:tag set to nested_fragment
((MyNestedFragment)getChildFragmentManager()
.findFragmentByTag("nested_fragment"))
.dependencies(this.deps);
return rootView;
}
}
public static class MyNestedFragment extends Fragment {
void dependencies(Deps deps) {
...
}
}
...
}
, bu. Yaşam döngüleri iç içe geçmiş FragmentManager'lar tarafından yönetilmelidir. Parçalarınızı < fragmanını > elemanını kullanmaktan ziyade programsal olarak oluşturursanız, yaşam döngüsü boyunca daha karmaşık bir maliyetle biraz daha fazla kontrole sahip olacaksınız. Eğer bir IoC konteyner gibi Android'i tedavi etmek istiyorsanız
ardından RoboGuice aradığınız şey olabilir:
public class MyActivity extends roboguice.activity.RoboFragmentActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
// This only needs to be called once for the whole app, so it could
// be in the onCreate() method of a custom Application subclass
RoboGuice.setUseAnnotationDatabases(false);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public static class MyNestedFragment extends Fragment {
@Inject
private Deps deps;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// this isn't necessary if you extend RoboFragment
roboguice.RoboGuice.getInjector(activity).injectMembers(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//This would not even be possible in the previous example
// because onCreateView() is called before dependencies()
// can be called.
deps.method();
View rootView = inflater.inflate(R.layout.fragment_nested, container, false);
return rootView;
}
}
}
@Singleton
public class Deps {
public void method() {
System.out.println("Deps.method()");
}
}
Hançer2'yi mi kullanıyorsunuz? Bu tür şeyleri yönetmek için dizayn edilmiştir –
Mimmo Grottoli, ben hançer2 hakkında biliyorum. Ama bu sadece bağımlılık enjeksiyonunun kirletici kodunu ortadan kaldırmak için bir kütüphanedir. Bağımlıları kurucu veya özel yöntemle her zaman enjekte etme yolu olmalıdır. – wilddev
Bazı bağımlılıkları enjekte eden Fragmanlar veya Etkinlikler için bir kurucu?Tabii ki deneyebilirsiniz, ama sonunda hançer veya hançer2'nin kendi başınıza geliştirebileceğiniz en iyi şeyler olduğunu görürsünüz (en azından bu benim için doğrudur) –