MyFragment
がMyNestedFragment
に依存し、MyNestedFragment
はDeps
に依存している場合。 MyFragment
もまたDeps
に依存します。もちろん、のインスタンスは存在しません。Activity.onAttachFragment()
が呼び出されたときには、MyNestedFragment
の依存関係を提供する前に、レイアウトをMyFragment.onCreateView()
に膨張させておく必要があります。
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) {
...
}
}
...
}
このすべてが少し厄介と思われる場合、それはフラグメントがPOJOではないので、あなただけのいくつかの任意の方法で配線することができます。ライフサイクルは、ネストされたFragmentManagersによって管理される必要があります。 <フラグメント>要素を使用するのではなく、プログラムでフラグメントを作成すると、複雑さを犠牲にしてライフサイクル全体をより詳細に制御できます。
あなたはIoCコンテナのようなアンドロイドを扱いたい場合は、RoboGuiceは、あなたが探しているものかもしれ:
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()");
}
}
dagger2を使用しますか?この種のものを管理するように設計されています –
Mimmo Grottoli、私はdagger2について知っています。しかし、それは依存性注入の定型コードを排除する単なるライブラリです。依存関係をコンストラクタや特別なメソッドで注入する方法は常に存在するはずです。 – wilddev
依存関係を挿入するフラグメントまたはアクティビティのコンストラクタ?もちろん、試してみることもできますが、最終的には、daggerやdagger2があなた自身で開発することができる最良のものです(少なくとも、これは私には当てはまります) –