2 つの異なるフラグメントがあり、両方とも 2 つの異なるアクティビティで使用されます。どちらのアクティビティのレイアウトにも、フラグメント コンテナーとして使用するフレーム レイアウトが 1 つあります。
どれが;
フラグメント: MapFragment、ListFragment
アクティビティ: HomeActivity、SearchActivity。
HomeActivity について話しましょう。
HomeActivity は、アクティビティの onCreate に ListFragment と MapFragment を挿入し、挿入されたフラグメントをそのレイアウトにプッシュします (最初にフラグメントをリストします)。その後、アクティビティは、挿入されたフラグメントのプレゼンター メソッドを呼び出して、サービスの結果をリストまたはマップに表示します。
コード; フラグメント側;
@CustomScope
@Component(dependencies = NetComponent.class, modules = {ChallengeListFrgModule.class, ChallengeRepositoryModule.class})
public interface ChallengeListFrgComponent{
void inject(ChallengeListFragment fragment);
}
_
@Module class ChallengeListFrgModule(private val mView: ChallengeListFrgContract.View) {
@Provides internal fun providesChallengeListFrgContractView(): ChallengeListFrgContract.View {
return mView
}
}
ListFrgPresenter:
public class ChallengeListFrgPresenter implements ChallengeListFrgContract.Presenter {
//region Variables
ChallengeListFrgContract.View mView;
ChallengeRepository challengeRepository;
// Application application;
private ChallengeSearchCriteria challengeSearchCriteria;
//endregion
//region Constructer
@Inject public ChallengeListFrgPresenter(ChallengeRepository challengeRepository,
ChallengeListFrgContract.View mView) {
this.mView = mView;
this.challengeRepository = challengeRepository;
}
//endregion
//region Override Methods
@Override public void load() {
}
@Override public void clearChallenges() {
mView.clearChallenges();
}
}
チャレンジリストフラグメント:
@Singleton
class ChallengeListFragment/*@Inject*/
: BaseFragment(), ChallengeListFrgContract.View {
@Inject
lateinit var challengeListFrgPresenter: ChallengeListFrgPresenter
///...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initComponent()
}
fun initComponent() {
DaggerChallengeListFrgComponent.builder()
.netComponent((activity.applicationContext as DuupleApplication).netComponent) // crash
.challengeListFrgModule(ChallengeListFrgModule(this as ChallengeListFrgContract.View))
.challengeRepositoryModule(ChallengeRepositoryModule(activity))
.build()
.inject(this)
}
}
活動面:
HomeActivity コンポーネント:
@CustomScope @Component(dependencies = NetComponent.class, modules = {
HomeActivityModule.class, HomeFragmentManagerModule.class, ChallengeListFrgModule.class,
HomeNearbyMapFrgModule.class
}) public interface HomeActivityComponent {
Context context();
void inject(HomeActivity activity);
}
HomeActivityModule;
@Module public class HomeActivityModule {
private final HomeActivityContract.View mView;
private final Context context;
public HomeActivityModule(HomeActivityContract.View mView, Context context) {
this.mView = mView;
this.context = context;
}
@Provides @CustomScope Context provideContext() {
return context;
}
@Provides @CustomScope HomeActivityContract.View providesActivityContractView() {
return mView;
}
@Provides @CustomScope ChallengeListFragment providesChallengeListFragment() {
return new ChallengeListFragment();
}
@Provides @CustomScope HomeNearbyMapFragment providesHomeNearbyMapFragment() {
return new HomeNearbyMapFragment();
}
}
ホームアクティビティ:
public class HomeActivity extends DrawerActivity
implements NavigationView.OnNavigationItemSelectedListener, HomeActivityContract.View {
//region widgets
Toolbar appToolbar;
ImageView imageViewHamburger;
private DrawerLayout drawerLayout;
//endregion
//region variables
@Inject ChallengeListFragment challengeListFragment;
@Inject HomeNearbyMapFragment homeNearbyMapFragment;
@Inject ChallengeListFrgPresenter challengeListFrgPresenter;
@Inject HomeNearbyMapFrgPresenter homeNearbyMapFragmentPresenter;
//...
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
initComponent();
///...
pushFragment(challengeListFragment, FragmentHelper.homeListFragmnetIndex);
}
protected void initComponent() {
DaggerHomeActivityComponent.builder()
.netComponent(((DuupleApplication) getApplicationContext()).getNetComponent())
.homeActivityModule(new HomeActivityModule(this, this))
.challengeListFrgModule(
new ChallengeListFrgModule((ChallengeListFrgContract.View) challengeListFragment))
.homeFragmentManagerModule(
new HomeFragmentManagerModule(HomeActivity.this, manager, R.id.placeHolder_HomeAct))
.homeNearbyMapFrgModule(
new HomeNearbyMapFrgModule((HomeNearbyMapFrgContract.View) homeNearbyMapFragment))
.build()
.inject(this);
}
}
更新: 問題は次のとおりです。initComponent メソッドの HomeActivity に challengeListFragment を注入する必要があります。また、同じ場所でパラメータとして ChallengeListFrgModule に challengeListFragment オブジェクトを渡す必要があります。ここで問題が発生したと思います。ChallengeListFragment オブジェクトの注入が完了する前に、ChallengeListFrgModule コンストラクターがトリガーされました。どうすれば修正できますか