6

I) (MyFragment ebeveynin aktivite onAttachFragment içinde veridiliminin bağımlılıklarıİç içe geçmiş android parçasına bağımlılık nasıl aşılanır? Sıradan (olmayan iç içe fragmanı) için

class MyFragment extends MyFragment { 
     void dependencies(Deps deps); 
} 

2) ayarlamak için aşağıdaki yaklaşımı

1) bağımlılıklar oluşturmak (...) yöntemi kullanmak yöntem sadece adlandırılan artık onAttachFragment parçası olduğu iç içe fragmanı için parçanın

class MyActivity{ 
    void onAttachFragment(Fragment f){ 
     ((MyFragment)f).dependencies(deps); 
    } 
} 

için bağımlılıkları sağlarlar. parçası için yalnızca iç içe geçmiş fragman için bağımlılık sağlamak için bağımlılıkların sağlanması çok hantal gibi görünüyor. Peki bunun için nasıl bağımlılıklar sağlayabilirim?

+0

Hançer2'yi mi kullanıyorsunuz? Bu tür şeyleri yönetmek için dizayn edilmiştir –

+0

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

+0

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) –

cevap

1

Sadece hiyerarşi mantığı tutmak ve bu gibi bir şey olmalı:

class MyActivity{ 
    void onAttachFragment(Fragment f){ 
     ((MyFragment)f).dependencies(deps); 
    } 
} 

class MyFragment extends MyFragment { 
     void dependencies(Deps deps) { 
      //TODO: do dependencies of my fragment before 
      ((MyNestedFragment)childF).nestedDependencies(deps); 
      //TODO: do dependencies of my fragment after 
     } 
} 

class MyNestedFragment extends MyNestedFragment { 
     void nestedDependencies(Deps deps); 
} 
+0

MyFragment'e bağımlılıkları enjekte etmek çok garip, çünkü onlara ihtiyaç duymuyor. MyFragment, depslere bağlı değildir. – wilddev

+0

Sorunun amacı nedir o zaman? –

+0

Iliiaz Akhmedov, MyFragment, depslere bağlı değildir, ancak MyNestedFragment yapar! Bu yüzden MyFragment'e geçen geçişler antipattern. – wilddev

2

MyFragmentMyNestedFragment bağlıdır ve MyNestedFragmentDeps 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()"); 
    } 
} 
5

Sadece bir etkinlik olacak bağlamı onu yap. Etkinliğinizdeki bağımlılıklar için bir alıcı oluşturun. Fragmanlar, iç içe geçmiş olsun olmasın ebeveyn etkinliğine erişebilir. İçeriği yayınlayın ve iç içe geçmiş etkinliğe bağımlılıkları almak için alıcıyı çağırın.

+0

Ekstra kredi için ComponentProvider bir arabirim oluşturun ve etkinliğinizin bunu gerçekleştirmesini sağlayın, bu da tek bir getComponent yöntemi ortaya çıkarır. GetContext, etkinliklerin parçalarının yeniden kullanılmasına izin veren belirli bir etkinlikten ziyade arabirime dökülmelidir. – FriendlyMikhail

2

Parçalar eklendiğinde, bağımlılıkları ayarlamaya çalışın. Bunun yerine, gerektiğinde parçalardan bağımlılıkları almaya çalışın. bir örnek vardır: Elbette

public class MyActivity extends Activity { 

    public Deps getDepsForFragment(Fragment fragment) { 
     if (fragment instanceof MyFragment) { 
      return depsForMyFragment; 
     } else if (fragment instanceof MyNestedFragment) { 
      return depsForMyNestedFragment; 
     } else { 
      return null; 
     } 
    } 
} 

public class MyFragment extends Fragment { 

    private Deps deps; 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     try { 
      MyActivtiy myActivity = (MyActivtiy) context; 
      deps = myActivity.getDepsForFragment(this); 
     } catch (ClassCastException e) { 
      throw new ClassCastException("This fragment attached to an activity which can't provide the required dependencies."); 
     } 
    } 
} 

// this is the same as the MyFragment 
public class MyNestedFragment extends Fragment { 

    private Deps deps; 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     try { 
      MyActivtiy myActivity = (MyActivtiy) context; 
      deps = myActivity.getDepsForFragment(this); 
     } catch (ClassCastException e) { 
      throw new ClassCastException("This fragment attached to an activity which can't provide the required dependencies."); 
     } 
    } 
} 

, siz (getDepsForMyFragment ve getDepsForMyNestedFragment benzeri) aktivitesinde olsun-PS için ayrı bir yöntem yapabilirsiniz.

İlgili konular