어제 새벽까지 하다 도저히 안되어 올렸었는데요.
아무런 답변을 못받았습니다.
아래 보시고 답변 좀 부탁 드리겠습니다.
리스트뷰 내에 있는 체크 박스 클릭 시
클릭된 정보를 저장하려고 합니다.
현재는 한개만 클릭해보고 이벤트가 있는지만 확인하려고 하는데요.
자꾸 아래 부분에서 NullPointerException로 인해서 죽습니다.
도무지 왜 원인을 모르겠네요.
---------------------소스------------------------
package org.tacademy.listview;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.Toast;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.content.SharedPreferences;
public class WifiListViewActivity extends Activity {
private String[] values = new String[15];
//private String[] values;
WifiManager mainWifi;
WifiReceiver receiverWifi;
ScreenReceiver receiverScreen;
List<ScanResult> wifiList;
StringBuilder sb = new StringBuilder();
WifiInfo wifiInfo;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifiInfo = mainWifi.getConnectionInfo();
//String name = wifiInfo.getSSID();
/* Wifi Broadcast*/
receiverWifi = new WifiReceiver();
registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
if (!mainWifi.isWifiEnabled()) {
mainText.setText("isWifiEnabled failed\n");
return;
}
mainWifi.startScan();
mainText.setText("\nStarting Scan...\n");
/* Screen Broadcast*/
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
// 레이아웃 파일의 리스트뷰를 가져와 커스텀어답터를 세팅한다.
final ListView listView = (ListView) findViewById(R.id.listView);
AreaList al = new AreaList(this, 0);
listView.setAdapter(al);
//listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
CheckBox chk = (CheckBox) convertView.findViewById(R.id.checkBox);
chk.setOnClickListener(new OnClickListener(){ // NullPointerException 발생 지점(76라인)
public void onClick(View v) {
System.out.println("ap is checked");
//if (ob instanceof Boolean) {
//check.setTag(!(Boolean)ob);
//}
}
});
/*
// Shared Preference를 불러옴
SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);
CheckBox check = (CheckBox)findViewById(R.id.checkBox);
// 저장된 값들을 불러옴
Boolean chk = pref.getBoolean("SlientMode", false);
System.out.println(chk);
if(pref != null)
check.setChecked(chk);
else
check.setChecked(true);
*/
}
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 0, 0, "Refresh");
return super.onCreateOptionsMenu(menu);
}
// 어플리케이션이 화면에서 사라질 때
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
/*
// UI 상태를 저장
SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit(); // Editor를 불러옴
CheckBox check = (CheckBox)convertView.findViewById(R.id.checkBox);
// 저장할 값들을 입력
editor.putBoolean("Check", check.isChecked());
// 저장
editor.commit();
*/
}
public boolean onMenuItemSelected(int featureId, MenuItem item) {
mainWifi.startScan();
mainText.setText("Starting Scan");
return super.onMenuItemSelected(featureId, item);
}
protected void onPause() {
unregisterReceiver(receiverWifi);
super.onPause();
}
protected void onResume() {
registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
super.onResume();
}
class WifiReceiver extends BroadcastReceiver {
public void onReceive(Context c, Intent intent) {
//sb = new StringBuilder();
wifiList = mainWifi.getScanResults();
//values = new String[wifiList.size()];
System.out.println(values.length);
System.out.println(wifiList.size());
for(int i = 0; i < (wifiList.size()); i++) {
//sb.append(new Integer(i+1).toString() + ".");
values[i] = (wifiList.get(i)).SSID;
//sb.append("\n\n");
}
//mainText.setText(sb);
}
private void println(String string) {
// TODO Auto-generated method stub
}
}
class ScreenReceiver extends BroadcastReceiver {
public void onReceive(Context c, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
// turn Wi-Fi off
//mainWifi.setWifiEnabled(false);
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
// turn Wi-Fi on
//mainWifi.setWifiEnabled(true);
}
}
}
private class AreaList extends ArrayAdapter<STRING> {
public AreaList(Context context, int textViewResourceId) {
super(context, textViewResourceId);
}
// 배열의 길이를 리턴하여 리스트의 개수를 계산한다.
@Override
public int getCount() {
return values.length;
}
// 배열의 개수만큼 리스트를 만든다.
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.list_items, null);
}
if (values[position] != null) {
TextView tv = (TextView) convertView.findViewById(R.id.textView);
if (tv != null) {
tv.setText(values[position]);
}
}
return convertView;
}
}
}
------------logcam------------------------
01-24 01:35:44.245: W/dalvikvm(7625): threadid=1: thread exiting with uncaught exception (group=0x4001d7f0)
01-24 01:35:44.249: E/AndroidRuntime(7625): FATAL EXCEPTION: main
01-24 01:35:44.249: E/AndroidRuntime(7625): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.tacademy.listview/org.tacademy.listview.WifiListViewActivity}: java.lang.NullPointerException
01-24 01:35:44.249: E/AndroidRuntime(7625): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
01-24 01:35:44.249: E/AndroidRuntime(7625): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
01-24 01:35:44.249: E/AndroidRuntime(7625): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
01-24 01:35:44.249: E/AndroidRuntime(7625): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
01-24 01:35:44.249: E/AndroidRuntime(7625): at android.os.Handler.dispatchMessage(Handler.java:99)
01-24 01:35:44.249: E/AndroidRuntime(7625): at android.os.Looper.loop(Looper.java:123)
01-24 01:35:44.249: E/AndroidRuntime(7625): at android.app.ActivityThread.main(ActivityThread.java:4627)
01-24 01:35:44.249: E/AndroidRuntime(7625): at java.lang.reflect.Method.invokeNative(Native Method)
01-24 01:35:44.249: E/AndroidRuntime(7625): at java.lang.reflect.Method.invoke(Method.java:521)
01-24 01:35:44.249: E/AndroidRuntime(7625): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
01-24 01:35:44.249: E/AndroidRuntime(7625): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-24 01:35:44.249: E/AndroidRuntime(7625): at dalvik.system.NativeStart.main(Native Method)
01-24 01:35:44.249: E/AndroidRuntime(7625): Caused by: java.lang.NullPointerException
01-24 01:35:44.249: E/AndroidRuntime(7625): at org.tacademy.listview.WifiListViewActivity.onCreate(WifiListViewActivity.java:76)
01-24 01:35:44.249: E/AndroidRuntime(7625): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-24 01:35:44.249: E/AndroidRuntime(7625): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
01-24 01:35:44.249: E/AndroidRuntime(7625): ... 11 more
01-24 01:35:45.972: I/Process(7625): Sending signal. PID: 7625 SIG: 9
convertView를 listView로 변경해도 똑같이 NullPointerException가 발생합니다...
Checkbox 클릭 시 해당 event를 받아올 수 있는 다른 방법이 있는건가요?
아니면 지금 구현 코드에 문제가 있는건가요?
checkbox 가 ArrayList 클래스에서 사용하는 레이아웃에 포함되어 있는 리소스 같은데요~
그렇다면 기본적으로 ArrayList 클래스의 getView 에서
레이아웃을 연결한 다음에 checkbox 에 대한 클릭 이벤트를 처리하셔야 정상적으로 처리되지 싶습니다.
CheckBox chk = (CheckBox) convertView.findViewById(R.id.checkBox);
chk.setOnClickListener(new OnClickListener(){ // NullPointerException 발생 지점(76라인)
public void onClick(View v) {
System.out.println("ap is checked");
//if (ob instanceof Boolean) {
//check.setTag(!(Boolean)ob);
//}
}
});
이 부분을 AreaList 클래스의 getView 메서드
제일 마지막 return convertView 윗쪽으로 옯겨보세요~




저 onCreate() 메서드 안의 convertView 는 어디서 가져오신거에요?
R.id.checkBox 리소스 id가 R.java 리소스에 존재는 하지만
onCreate() 메서드에서 접근할 수 없는 영역에 존재하므로
코드 상에서는 오류가 없지만,
실제 앱 실행시 NullPointerException 이 발생되는 것으로 보여집니다만...