7

, Ben bir Fragman bir bağımlılık enjekte etmek için en iyi yol olduğunu anlamaya çalışıyorum. RoboGuice gibi dış çerçevelerden bağımsız olmak istiyorumAndroid Fragmanı ve Bağımlılık Enjeksiyon

Şimdi, mümkün olan en basit şekilde, bir tür mantığı özetleyen bir arabirime sahibim ve bir Etkinlik'ten, bunun bir uygulamasını enjekte etmek istiyorum arayüz. Sistemin parçamı yeniden oluşturması gerekebileceğinden ve parçanın yeni bir örneğini oluşturmanın olağan yolunun yaratımı yöneten statik bir yöntem sağlamak olduğu için parçam için varsayılan bir kurucu sağlaman gerektiğini biliyorum. Bu:

public static Fragment newInstance() { 
    final Bundle bundle = new Bundle(); 
    ... 
    final Fragment fragment = new MyFragment(); 
    fragment.setArguments(bundle); 
    return fragment; 
} 

Bağımlılığımı parçalara nasıl iletebilirim? Parcelable veya Serializable arayüzleri uygulamalı ve Bundle'a paketlemeli miyim? Sonucu elde etmenin başka bir yolu var mı?

Teşekkürler!

cevap

0

Neden bağımlılığınızı etkinlikten alamıyorsunuz?

public void onActivityCreated(Bundle b){ 
    super.onActivityCreated(b) 
    DependencyClass c = ((MyActivity)getActivity()).getDependency(); 
} 
+1

Sanırım doğru Aktiviteye Parçası birleştirilmesi bitireceğiz böyle yaparsanız? Yine de Parçanın bağımsız ve tekrar kullanılabilir olmasını istiyorum. – TheImplementer

7

Basit bir çözüm, Parça için gerekli olan Bağımlılıkları bildiren bir arabirimi bildirmektir. Daha sonra Fragman Bağlamının bu arabirimi uygulamasına izin verin ve Bağlamdan gerektiğinde bağımlılıkları yoklayın.

Sözleşme:

public interface MyDependencies { 

    MyDep getDep(); 

} 

Etkinlik:

public MyActivity extends Activity implements MyDependencies { 

    @Override 
    public MyDep getDep(){ 
     return createMyDependencyOrGetItFromASingletonOrGetItFromApplication() 
    } 
} 

Fragment:

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") 
    } 
} 

Yani, aslında, Aktivite hiçbir gereksiz bağlantı yoktur sözleşme ile tanımlanır çünkü bir arayüz.

0

Kurucu aracılığıyla bağımlılıktan geçemiyorsanız (varsayılan kurucuya ihtiyacınız varsa) ve Hançer veya RoboGuice gibi bir bağımlılık enjeksiyonu librasını kullanmak istemiyorsanız, diğer klasik yol bir diziye verilir. bağımlılığı "enjekte etmek".

Fragment MyFragment { 

Depend mDepend; 

.... 


    public void setDepend(Depend depend) { 
     mDepend = depend; 
    } 

} 

Ardından, etkinliğinizde onCreate yönteminde bağımlılığı enjekte edebilirsiniz.

böylece aktivitesinde böyle bir şey:

@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 
    } 
} 
+0

Bu çözümle ilgili sorun, android parçayı yeniden oluşturduğunda, varsayılan yapıcıyı kullandığında ve daha önce çağrılmış olsalar bile ayarlanmış yöntemleri çağırmamalarıdır. – FacundoJ

İlgili konular