기술 블로그

[안드로이드 복습] 13장 인터페이스 이용한 콜백 프래그먼트 본문

Android

[안드로이드 복습] 13장 인터페이스 이용한 콜백 프래그먼트

jaegwan 2018. 11. 26. 00:36
반응형

일반적으로 엑티비티가 뷰나 프래그먼트의 인스턴스를 가지고 있어서 이를 호출했으나 콜백은 

피호출자인 프래그먼트가 액티비티에게 거꾸로 알려주는 것이다. 

호출자입장에서는 변화를 감시하다가 알아채기떄문에 리스너라고도 불립니다.



여기서는 매인액티비티와 colorFragment, colorListFragment 3개의 java파일이 있습니다.


private ColorFragment mcolorFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mcolorFragment = (ColorFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_color);
//getSupportfragmentManager()를 호출하여 프래그먼트 매니져를 얻고 그다음 findviwebyi로 프래그먼트의 인스턴스객체를 얻습니다.

// mcolorFragment.setColor(Color.RED);
}

먼저 ColorFragment형 mcolorFragment 맴버를 선언한 뒤 (ColorFragment랑 연결된 xml내 fragment id를 findFragmentById로 가져올 것이므로)


getSupportFragmentManager()로 매니저를 얻어온 후 이어 findFragmentById로 가져옵니다. 후에 이를 캐스팅 해줍니다.




implements ColorListFragment.onColorSelectedListener

메인 액티비티에서 ColorListFragment 안에 onColorSelectedLIstener 인터페이스를 implements합니다.


@Override
public void onColorSelected(int color) {
mcolorFragment.setColor(color);

}

위에서 말한 인터페이스에 정의된 onColorSelected를 재정의합니다. 

mcolorfragment 객체는 colorFragment의 인스턴스 이므로  colorFragment안에잇는 setcolor 를 사용할 수 있습니다. 


물론 파라미터 전달은 colorListFragment에서 보냅니다. 




public class ColorListFragment extends ListFragment {
private onColorSelectedListener mListener;

interface onColorSelectedListener
{
void onColorSelected(int color);//인터페이스 추상메서드

}

@Override
public void onAttach(Context context) {
super.onAttach(context);
mListener = (onColorSelectedListener) context;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { //프래그먼트의 생명주기
super.onViewCreated(view, savedInstanceState);//oncraeteview 후에 사용됨

List<String> colorList = Arrays.asList("Red","Green","blue");//Arrayss.asList 가 객체생성을 내포 배열을 리스트로
ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(),android.R.layout.simple_list_item_1,colorList);//어댑터 파트 참조
//프래그먼트에서 액티비티 호출시 getactivity
setListAdapter(adapter);//setListAdapter에 어뎁터 전달 , ListFragment를 상속받았기에 가능한 일



}

@Override
public void onListItemClick(ListView l, View v, int position, long id) { //ListFragment가 제공하는 콜백메서드
ArrayAdapter<String> adapter= (ArrayAdapter<String>) l.getAdapter();
String colorString = adapter.getItem(position);
int color = Color.RED;
switch (colorString){
case "Red":
color = Color.RED;
break;
case "blue":
color = Color.BLUE;
break;
case "Green":
color = Color.GREEN;
break;
}
if(mListener!=null){
mListener.onColorSelected(color);
}
}

}

colorLIstfragment 전문입니다. 


인터페이스인 onClickSelectedLIstener의 객체인 mListener를 선언합니다. 



    @Override
public void onAttach(Context context) {
super.onAttach(context);
mListener = (onColorSelectedListener) context;
}

onAttach는 프래그먼트 생명주기에서 가장 먼저 호출되는 콜백 메서드입니다.

이를 재정의하는 데 넘어온 context는 이 프래그먼트를 포함하는 액티비티의 인스턴스입니다. 


context가 mListener를 구현하고 있다고 가정하고 강제 캐스팅하고있습니다. //구현이 안됐을시 캐스팅에 실패하므로 


 @Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { //프래그먼트의 생명주기
super.onViewCreated(view, savedInstanceState);//oncraeteview 후에 사용됨

List<String> colorList = Arrays.asList("Red","Green","blue");//Arrayss.asList 가 객체생성을 내포 배열을 리스트로
ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(),android.R.layout.simple_list_item_1,colorList);//어댑터 파트 참조
//프래그먼트에서 액티비티 호출시 getactivity
setListAdapter(adapter);//setListAdapter에 어뎁터 전달 , ListFragment를 상속받았기에 가능한 일



}

onViewCreated 안에서  리스트와 어댑터를 연결합니다.  Arrays.asLIst는 배열을 리스트처럼 사용하기 위해 사용한다.


(http://blog.naver.com/PostView.nhn?blogId=evella&logNo=90195439020&parentCategoryNo=&categoryNo=44&viewDate=&isShowPopularPosts=true&from=search)


setListAdapter는 ListFragment를 상속받았기에 쓸 수있다 

setLIstAdapter에 표시할 어뎁터를 넣어준다. 




@Override
public void onListItemClick(ListView l, View v, int position, long id) { //ListFragment가 제공하는 콜백메서드
ArrayAdapter<String> adapter= (ArrayAdapter<String>) l.getAdapter();
String colorString = adapter.getItem(position);
int color = Color.RED;
switch (colorString){
case "Red":
color = Color.RED;
break;
case "blue":
color = Color.BLUE;
break;
case "Green":
color = Color.GREEN;
break;
}
if(mListener!=null){
mListener.onColorSelected(color);
}
}

ListFragment에서 제공해주는 onLIstItemClick을 재정의한다 


위에서 정의한 리스트뷰는 l안에 들어있으므로 l.getAdapter로  ArrayAdapter타입의 adapter 에 집어 넣는다. 


colorString은 어뎁터 안에 getItem(position)으로 position(내용값)을 가져오고 


int color를 정의하고 스위치문으로 position값에 따라 color에 Color.값(int형)을 넣는다. (break조심)


그뒤 아직 onListItemClick안에 


mListener 널체크를 해주고 

이 콜백 메소드를 구현하는 쪽으로 color 값을 전달합니다. 


그로 인해 매인액티비티에서 구현했던


@Override
public void onColorSelected(int color) {
mcolorFragment.setColor(color);

}


쪽에서 color를 전달받게 되고 

아까 컬러를 표시하는  ColorFragment의 인스턴스 객체로 선언했던 mcolorFragment의 setColor메소드 쪽으로 인자를 전달해 보낸다


이제 ColorFragment를 보자 


public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {//액티비티의 oncreate와

//유사
return new View(getActivity());//context를 얻기위해 호스트 액티비티를 전달하였다. //이 프로그먼트가 구현된 액티비티의 프로그먼트영역의 뷰를

// getActivity로 가져올 수 있음을 확인



}

public void setColor(int color){
getView().setBackgroundColor(color);//getView oncreateview에서 리턴한 View를 얻을 수 있으므로 얻은 뷰의 배경색을 변경

}
}

리턴한 값을 보면 새로운 뷰를 getActivity로 전달했으므로 setColor에서 getView()메소드로 리턴한 뷰를 얻을 수 있습니다. 



이런 프래그먼트 콜백을 쉽게해주는 이벤트버스라는 것도 있다고 한다. 

반응형
Comments