본문 바로가기

Programming/Android

Dagger2, MVP, annotation (좀 더 내 취향의 코드)

회사에서도 만들고 있지만, 다른 개발자와의 협업을 위해 중간중간 로직에 대해 논의하고 코드를 짜고 있음 (다같이 이해하기 쉬운쪽으로 배려해줘야 하니까)


현재 이 코드는 회사에서 사용 안하고 있지만 좀 더 내 취향에 맞는 Dagger2와 MVP사용 방식이라 올려둠

(github에 회사말고 새로운 내 프로젝트를 만들려고 했는데, 지금 좀 바쁜시기라 나중에 하기로...)


먼저 BaseActivity 

- activity_base xml은 툴바만 있는 레이아웃

- 툴바가 있는 화면과 없는 화면을 구분하기 위해 setToolbarHidden을 만듬(아니면 그냥 Toolbar 없는 클래스를 하나 더 만들어도 될 듯)

@EActivity(R.layout.activity_base)
public abstract class BaseActivity<T extends BasePresenter> extends AppCompatActivity implements BaseView {

@Inject
protected T presenter;

@ViewById
protected Toolbar toolbar;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setSupportActionBar(toolbar);
}

protected ActivityComponent getActivityComponent() {
return DaggerActivityComponent.builder()
.appComponent(((BPApplication) getApplicationContext()).getAppComponent())
.activityModule(new ActivityModule(this))
.build();
}

public void setToolbarHidden(boolean hidden, FrameLayout container) {
if (hidden) {
toolbar.setVisibility(View.INVISIBLE);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) container.getLayoutParams();
params.setMargins(0, 0, 0, 0);
container.setLayoutParams(params);
} else {
toolbar.setVisibility(View.VISIBLE);

runOnUiThread(() -> {
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) container.getLayoutParams();
params.setMargins(0, toolbar.getHeight(), 0, 0);
container.setLayoutParams(params);
});
}
}
}


BaseFragment

- BackKey처리와 presenter injection처리 완료

public abstract class BaseFragment<T extends BasePresenter> extends Fragment implements View.OnKeyListener, BaseView {

@Inject
protected T presenter;

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(this);
}

protected FragmentComponent getFragmentComponent(){
return DaggerFragmentComponent.builder()
.appComponent(((BPApplication)getActivity().getApplicationContext()).getAppComponent())
.fragmentModule(new FragmentModule(this))
.build();
}

@Override
public boolean onKey(View view, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP){
onBackButtonPressed();
return true;
}
return false;
}

public abstract boolean onBackButtonPressed();


}


BasePresenter

- Contract에 있는 Presenter인터페이스에서 상속받아야 할 BasePresenter

- Presenter class에서 변수에 XXXContract.View view선언 후 사용할 것

public interface BasePresenter<T extends BaseView> {

void attachView(T view);
void detachView();
}

BaseView

- Contract에 있는 View인터페이스에서 상속받아야 할 BaseView

- 현재 아무것도 없지만 Toast나 기본으로  들어가야 할 view를 넣어주면 좋을 듯

public interface BaseView {
}

ActivityComponent

- Injection할 activity들은 여기에 다 inject할 것

@ActivityScope
@Component(dependencies = AppComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {

Activity getActivity();
// void inject(ContractActivity activity);
}

FragmentComponent

- Injection할 Fragment들은 여기에 다 inject할 것

@FragmentScope
@Component(dependencies = AppComponent.class, modules = FragmentModule.class)
public interface FragmentComponent {

}

ActivityModule

@Module
public class ActivityModule {
Activity activity;

public ActivityModule(Activity activity) {
this.activity = activity;
}

@Provides
@ActivityScope
Activity providesActivity(){
return activity;
}
}

FragmentModule

@Module
public class FragmentModule {
Fragment fragment;

public FragmentModule(Fragment fragment) {
this.fragment = fragment;
}

@Provides
@FragmentScope
Fragment providesFragment(){
return fragment;
}
}


'Programming > Android' 카테고리의 다른 글

Glide Svg 이미지관련  (0) 2017.05.19
RealmList와 Realm + Rx2 사용 이슈  (0) 2017.05.19
Permission check관련  (0) 2017.03.09
Android Studio java1.8관련 에러  (0) 2017.02.25
Dagger2 및 Annotation 사용중 관련에러  (0) 2017.02.18