안드로이드 개발 질문/답변
(글 수 45,052)
현재 만들고 있는 어플의 구조는 다음과 같습니다.
먼저 메인 액티비티가 있고...여기에 ViewPager를 만들어두고 ViewPager에서는 페이지가 바뀌면 각 페이지의 클래스를 호출하여 그곳에서 레이아웃의 내용을 초기화 합니다. 아래와 같은 형태로...
public Object instantiateItem(View pager, int position) {
mView = null;
mView = (View)mInflater.inflate(mLayoutId[position], null);
switch(position){
case 0:
m_obj = (m1Food)new m1Food(mView,mContext);
((m1Food) m_obj).Init();
break;
case 1:
//m_obj = (m2Bus)new m1Bus(mView);
//((m2Bus) m_obj).Init();
break;
case 2:
m_obj=(m3TimeTable) new m3TimeTable(mView,mContext);
((m3TimeTable) m_obj).init();
break;
}
((ViewPager)pager).addView(mView, position, new LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT )); //뷰 페이저에 추가
return mView;
}
그리고 현재 제작중인 기능은 시간표쪽 뷰에서 그리드뷰의 특정 칸을 누르면 팝업메뉴가 뜨고 거기서 추가를 누를시 따로 입력 다이얼로그가 뜨면서 거기에서 입력을 끝냈을시 빠져나오면서 값을 가지고 나오는건데..
이게 액티비티<->액티비티의 경우 startActivityForResult를 사용하면 되는데..
클래스 <->액티비티의 구조에선 startActivityForResult가 사용이 안되더라구요.
현재 문제가 되는 부분입니다.
//Set listener for action item clicked
quickAction.setOnActionItemClickListener(new QuickAction.OnActionItemClickListener() {
@Override
public void onItemClick(QuickAction source, int pos, int actionId) {
ActionItem actionItem = quickAction.getActionItem(pos);
//here we can filter which action item was clicked with pos or actionId parameter
if (actionId == ID_ADD) {
Intent intent = new Intent(m_Context, TableDialog.class);
m_Context.startActivity(intent);
strName = intent.getStringExtra("data_name"); // 과목명 스트링에 입력된 과목명 저장
strProfesser = intent.getStringExtra("data_professer"); // 교수명 스트링에 입력된 교수명 저장
strRoom = intent.getStringExtra("data_room");// 강의메모 스트링에 입력된 강의메모 저장
}
};
저기 strName,Professer,Room 부분이 값을 다시 전달받을 부분인데..임시로 저렇게 해뒀습니다.
저 데이터들은 차후
/**
* db에 값을 쓰기전에 변수들을 설정하고 row에 값을 넣는 함수
* @param position
* @param flag
*/
public void updateView(int position,int flag)
{
row = new ContentValues();
row.put("datapos", position); // db에 포지션 삽입
row.put("name", strName); // db에 과목명 삽입
row.put("professor", strProfesser); // db에 교수명 삽입
row.put("room", strRoom); // db에 강의메모 삽입
switch(flag){
case 0: //Update 모드일때...
m_sql.Open();
cursor = m_sql.select("*", "timetable");
m_sql.update("timetable", row, "datapos="+position);
break;
case 1: //insert 모드일때...
m_sql.Open();
cursor = m_sql.select("*", "timetable");
cursor.moveToFirst();
while(position != cursor.getInt(0))
{
cursor.moveToNext();
}
m_sql.insert("timetable",row);
break;
}
data_list.add(position, data_add(strName,strProfesser,strRoom)); // 시간표에 입력받은 과목명 표시
m_Adapter.notifyDataSetChanged(); // 시간표 갱신
cursor.close();
m_sql.Close();
}
이곳에서 활용됩니다.
해결방법:
먼저 브로드캐스트리시버를 상속받은 커스텀 리시버를 생성합니다.이건 값을 활용할곳에 인라인으로 선언합니다.
public class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
strName = intent.getStringExtra("data_name"); // 과목명 스트링에 입력된 과목명 저장
strProfesser = intent.getStringExtra("data_professer"); // 교수명 스트링에 입력된 교수명 저장
strRoom = intent.getStringExtra("data_room");// 강의메모 스트링에 입력된 강의메모 저장
m_msg.DebugLog("name", intent.getStringExtra("data_name"));
m_msg.DebugLog("professer", intent.getStringExtra("data_professer"));
m_msg.DebugLog("room", intent.getStringExtra("data_room"));
updateView(idx,INSERT);
}
}
아래와 같이 커스텀 리시버를 선언후 IntentFilter를 만들어서 그곳에 필터할 값을 addAction을 이용해 등록하고 리시버를 등록합니다.
그리고 액티비티를 실행합니다.
if (actionId == ID_ADD) {
Receiver r=new Receiver();
IntentFilter filter=new IntentFilter();
Intent intent = new Intent(m_Context, TableDialog.class);
filter.addAction("TableAdd");
m_act.registerReceiver(r, filter);
m_act.startActivity(intent);
}
값을 전달할곳에선 아래와 같이 Intent를 생성후 전해줄 값을 넣고 setAction에 위에 정해둔 액션을 넣습니다.
그리고 sendBroadcast를 하면 액티비티<->클래스가 가능합니다.
Intent intent = new Intent();
intent.putExtra("data_name",m_name.getText().toString());
intent.putExtra("data_professer", m_professer.getText().toString());
intent.putExtra("data_room", m_room.getText().toString());
m_msg.DebugLog("sendready", "send!");
intent.setAction("TableAdd");
sendBroadcast(intent); // 추가 정보를 넣은 후 다시 인텐트를 반환합니다.