안드로이드 개발 질문/답변
(글 수 45,052)
GridView에 baseAdapter를 이요하여 [ 이미지 | 텍스트 | 버튼 ] 으로 구성된 리스트를 만들었습니다.
이 버튼을 눌렀을경우 다른인텐트로 이동하게 하고싶은데요. 이게 잘 안되네요;
movePage란 함수를 만들었고 GridView에 버튼이아니라 버튼을 하나 만들어서 저 movePage를 콜했을때는 이상없이
동작하는데요.
BaseAdapter에서 구현한 버튼에서 페이지 이동을 위한 intent를 어떤식으로 해줘야할지 모르겠습니다.
public void onCreate(Bundle savedInstanceState) {
...
public void movePage(Context ctx, Class<?> cls){
Intent intent = new Intent(ctx, cls);
startActivity(intent);
}
}
//리스트 뷰에 출력할 항목
class MyItem {
MyItem(int aIcon, String aName, String aValue) {
...
}
...
}
// 어댑터 클래스
class MyListAdapter extends BaseAdapter {
Context maincon;
LayoutInflater Inflater;
ArrayList<MyItem> arSrc;
int layout;
public MyListAdapter(Context context, int alayout, ArrayList<MyItem> aarSrc) {
maincon = context;
Inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
arSrc = aarSrc;
layout = alayout;
}
// 각 항목의 뷰 생성
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = Inflater.inflate(layout, parent, false);
}
ImageView img = (ImageView) convertView.findViewById(R.id.img);
img.setImageResource(arSrc.get(position).icon);
TextView txt = (TextView) convertView.findViewById(R.id.text);
txt.setText(arSrc.get(position).name);
Button btn = (Button) convertView.findViewById(R.id.btn);
btn.setOnClickListener(new Button.OnClickListener() {
// 메뉴리스트 버튼을 클릭했을 경우
public void onClick(View v) {
new ListViewTest().movePage(??,Main.class);
}
});
return convertView;
}
}
에러로그는
06-30 02:12:40.280: ERROR/AndroidRuntime(716): java.lang.NullPointerException
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.content.ContextWrapper.getPackageName(ContextWrapper.java:120)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.content.ComponentName.<init>(ComponentName.java:75)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.content.Intent.<init>(Intent.java:2551)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at hm.android.ListViewTest.movePage(ListViewTest.java:45)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at hm.android.MyListAdapter$1.onClick(ListViewTest.java:112)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.view.View.performClick(View.java:2364)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.view.View.onTouchEvent(View.java:4179)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.widget.TextView.onTouchEvent(TextView.java:6540)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.view.View.dispatchTouchEvent(View.java:3709)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.os.Handler.dispatchMessage(Handler.java:99)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.os.Looper.loop(Looper.java:123)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at android.app.ActivityThread.main(ActivityThread.java:4363)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at java.lang.reflect.Method.invokeNative(Native Method)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at java.lang.reflect.Method.invoke(Method.java:521)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
06-30 02:12:40.280: ERROR/AndroidRuntime(716): at dalvik.system.NativeStart.main(Native Method)
intent를 못찾는거 같긴한데.. baseadapter에서 다른 intent호출할때 어떻게해야하는지 조언좀 부탁드립니다.
2010.06.30 13:03:03
new ListViewTest().movePage(??,Main.class);
위 코드에서 에러가 난 거 같은데요....
위 코드를 제대로 적어주시면 좀더 확실한 답변이 가능할듯 하네요
Intent intent = new Intent(action명);
startactivity(intent);
위와 같이 선언 하시면 새로운 인텐트를 실행할 수 있습니다.
action명은 AndroidManifest.xml에 선언하여 호출하실수 있습니다.
2010.06.30 14:05:36
음..
movePage 구현 하신게 제대로 동작하셨다면..
아래 처럼 MyListAdapter 생성하실때 받아온 Context 객체 넣으시면 되겟네요.
new ListviewTest().movePage(maincon, Main.class);
저는 이렇게 분리된 이벤트 처리 방법보단.. Activity 에서 아답터에 Handler 객체를 넘겨서
아답터에서 처리할일이 생기면 엑티비티 쪽으로 실행 루틴을 옮기는 쪽을 추천드립니다.
movePage 구현 하신게 제대로 동작하셨다면..
아래 처럼 MyListAdapter 생성하실때 받아온 Context 객체 넣으시면 되겟네요.
new ListviewTest().movePage(maincon, Main.class);
저는 이렇게 분리된 이벤트 처리 방법보단.. Activity 에서 아답터에 Handler 객체를 넘겨서
아답터에서 처리할일이 생기면 엑티비티 쪽으로 실행 루틴을 옮기는 쪽을 추천드립니다.
2010.06.30 14:08:16
movePage() 가 onCreate() 내부에 있어서 그런거 아닌가요?
onCreate(){
...
movePage();
...
}
public void movePage(){
...
}
요렇게 밖으로 해야 위치가 new ListViewTest().movePage(); 이렇게 나올거 같은데요
...
안된네요
onCreate(){
...
movePage();
...
}
public void movePage(){
...
}
요렇게 밖으로 해야 위치가 new ListViewTest().movePage(); 이렇게 나올거 같은데요
...
안된네요
2010.06.30 14:40:33
ListViewTest 가 엑티비티 였군요^^
아마 엑티비티 인스턴스를 직접 만들려고 해서 에러가 나지 않을까 싶습니다..
흠..;;
Common Class 를 하나 만드시는게 어떨까요??
어차피 Context 받아오니 아래와 같이 일반 클래스에 메소드 만드시고 호출하시면 될것 같습니다.
public void movePage(Context ctx, Class<?> cls){
Intent intent = new Intent(ctx, cls);
ctx.startActivity(intent);
}