2009-08-12 10 views
3

하위 활동에서 텍스트 데이터 값을 다시 가져 오려고합니다. 그리고 모든 것은 괜찮습니다. 그러나 Sub-activity가 열렸을 때, 나는 단지 "button"을 다시 클릭하기 만하면 예외 오류가 발생한다. 안드로이드 NotePad 라이프 사이클 컨트롤에서 발견되었지만 이해하기 어렵습니다. 누군가 나를 도울 수 있습니까?안드로이드에서 뒤로 "버튼"제어

public class SBooksSearch extends Activity { 
private EditText mTextSearch; 
private Button searchButton; 
private SBooksDbAdapter mDbHelper; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.sbooks_search); 

    mTextSearch = (EditText)findViewById(R.id.text_search);  
    searchButton = (Button)findViewById(R.id.btn_search);  

    searchButton.setOnClickListener(new View.OnClickListener(){ 
     public void onClick(View v){     
      Intent intent = new Intent(); 
      intent.putExtra(SBooksDbAdapter.KEY_TITLE_RAW, mTextSearch.getText().toString());    
      setResult(RESULT_OK, intent); 
      finish(); 

     } 
    }); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState){ 
    super.onSaveInstanceState(outState); 

} 
@Override 
protected void onPause(){ 
    super.onPause(); 
    checkState(); 

} 
@Override 
protected void onResume(){ 
    super.onResume();  
} 


private void checkState() {  

} } 

이 로그 캣입니다 : 이것은 내 하위 활동이다

public class SBooks extends ListActivity { 
private String title_raw; 
private SBooksDbAdapter mDbHelper; 
private static final int ACTIVITY_SEARCH = 0; 

private static final int SEARCH_ID = Menu.FIRST;  

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.sbooks_list);  
    mDbHelper = new SBooksDbAdapter(this); 
    mDbHelper.open();      

} 

// Create Menu Option 
@Override 
public boolean onCreateOptionsMenu(Menu menu) {   
    boolean result = super.onCreateOptionsMenu(menu); 
    menu.add(0, SEARCH_ID, 0, R.string.menu_search);    
    return result;  
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()){ 
    case SEARCH_ID: 
     Intent intent = new Intent(this, SBooksSearch.class); 
     startActivityForResult(intent, ACTIVITY_SEARCH);    

    return super.onOptionsItemSelected(item); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent){ 
    super.onActivityResult(requestCode, resultCode, intent); 
     switch(requestCode){ 
     case ACTIVITY_SEARCH: 
      Bundle bundle = intent.getExtras(); 
      title_raw = bundle.getString(SBooksDbAdapter.KEY_TITLE_RAW); 
      if(title_raw!=null){ 
       Cursor cursor = mDbHelper.searchData(title_raw); 
       String[] from = new String[]{ SBooksDbAdapter.KEY_ROWID, 
         SBooksDbAdapter.KEY_TITLE, SBooksDbAdapter.KEY_LYRICS }; 
       int[] to = new int[]{ R.id.id, R.id.title, R.id.lyrics }; 
       SimpleCursorAdapter adapter = 
        new SimpleCursorAdapter(this, R.layout.sbooks_row, cursor, from, to); 
       setListAdapter(adapter); 

     } 

    } 
} 

}

: 이것은 내 코드입니다

08-12 18:44:39.211: WARN/InputManagerService(581): Starting input on non-focused client [email protected] (uid=10004 pid=623) 
08-12 18:44:39.510: INFO/ActivityManager(581): Displayed activity com.original.sbooks/.SBooks: 4934 ms 
08-12 18:44:40.821: WARN/KeyCharacterMap(730): No keyboard for id 0 
08-12 18:44:40.821: WARN/KeyCharacterMap(730): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 
08-12 18:44:41.412: INFO/ARMAssembler(581): generated scanline__00000177:03515104_00001A01_00000000 [ 64 ipp] (89 ins) at [0x297608:0x29776c] in 952924 ns 
08-12 18:44:41.520: INFO/ARMAssembler(581): generated scanline__00000177:03515104_00000A01_00000000 [ 46 ipp] (70 ins) at [0x297798:0x2978b0] in 517061 ns 
08-12 18:44:42.171: INFO/ActivityManager(581): Starting activity: Intent { comp={com.original.sbooks/com.original.sbooks.SBooksSearch} } 
08-12 18:44:52.196: WARN/ActivityManager(581): Launch timeout has expired, giving up wake lock! 
08-12 18:44:52.279: WARN/ActivityManager(581): Activity idle timeout for HistoryRecord{436bfc80 {com.original.sbooks/com.original.sbooks.SBooksSearch}} 
08-12 18:44:57.350: DEBUG/dalvikvm(620): GC freed 4103 objects/231808 bytes in 75ms 
08-12 18:45:05.130: DEBUG/dalvikvm(649): GC freed 2604 objects/150112 bytes in 88ms 
08-12 18:45:10.120: DEBUG/dalvikvm(623): GC freed 2750 objects/149592 bytes in 71ms 
08-12 18:45:11.920: INFO/ActivityManager(581): Displayed activity com.original.sbooks/.SBooksSearch: 29748 ms 
08-12 18:45:17.263: WARN/ActivityManager(581): Activity pause timeout for HistoryRecord{436bfc80 {com.original.sbooks/com.original.sbooks.SBooksSearch}} 
08-12 18:45:26.762: WARN/ActivityManager(581): Launch timeout has expired, giving up wake lock! 
08-12 18:45:27.272: WARN/ActivityManager(581): Activity idle timeout for HistoryRecord{435a7760 {com.original.sbooks/com.original.sbooks.SBooks}} 
08-12 18:46:04.905: DEBUG/AndroidRuntime(730): Shutting down VM 
08-12 18:46:04.905: WARN/dalvikvm(730): threadid=3: thread exiting with uncaught exception (group=0x4000fe70) 
08-12 18:46:04.905: ERROR/AndroidRuntime(730): Uncaught handler: thread main exiting due to uncaught exception 
08-12 18:46:04.991: ERROR/AndroidRuntime(730): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=0, data=null} to activity {com.original.sbooks/com.original.sbooks.SBooks}: java.lang.NullPointerException 
08-12 18:46:04.991: ERROR/AndroidRuntime(730):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3005) 
08-12 18:46:04.991: ERROR/AndroidRuntime(730):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3047) 
08-12 18:46:04.991: ERROR/AndroidRuntime(730):  at android.app.ActivityThread.access$2300(ActivityThread.java:112) 
08-12 18:46:04.991: ERROR/AndroidRuntime(730):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1721) 
08-12 18:46:04.991: ERROR/AndroidRuntime(730):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-12 18:46:04.991: ERROR/AndroidRuntime(730):  at android.os.Looper.loop(Looper.java:123) 
08-12 18:46:04.991: ERROR/AndroidRuntime(730):  at android.app.ActivityThread.main(ActivityThread.java:3948) 
08-12 18:46:04.991: ERROR/AndroidRuntime(730):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-12 18:46:04.991: ERROR/AndroidRuntime(730):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-12 18:46:04.991: ERROR/AndroidRuntime(730):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782) 
08-12 18:46:04.991: ERROR/AndroidRuntime(730):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540) 
08-12 18:46:04.991: ERROR/AndroidRuntime(730):  at dalvik.system.NativeStart.main(Native Method) 
08-12 18:46:04.991: ERROR/AndroidRuntime(730): Caused by: java.lang.NullPointerException 
08-12 18:46:04.991: ERROR/AndroidRuntime(730):  at com.original.sbooks.SBooks.onActivityResult(SBooks.java:111) 
08-12 18:46:04.991: ERROR/AndroidRuntime(730):  at android.app.Activity.dispatchActivityResult(Activity.java:3595) 
08-12 18:46:04.991: ERROR/AndroidRuntime(730):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3001) 
+1

"예외 오류"가 발생할 때 도움을주기를 원하면 예외와 관련된 Java 스택 추적을 게시 한 경우 도움이됩니다. 이것은 adb logcat, DDMS 또는 Eclipse의 DDMS Perspective를 통해 찾을 수 있습니다. – CommonsWare

+1

나는 logcat을 게시한다. 이것은 당신이 원하는 것이다. 죄송합니다. Android에서 디버그에 대한 경험이 없습니다. 도와 주셔서 감사합니다! – Dennie

답변

4

Nate가 intent.getExtras()에서 NPE에 대해 정확하다고 생각합니다.

당신은 무엇이든하기 전에 결과 코드의 값을 확인해야합니다. 또한 값을 얻기 전에 intent.hasExtra (SBooksDbAdapter.KEY_TITLE_RAW)를 확인해야 할 수도 있습니다. 따라서 다음과 같은 내용이 있습니다 :

switch(requestCode){ 
case ACTIVITY_SEARCH: 
    if (resultCode == RESULT_OK && intent.hasExtra(SBooksDbAdapter.KEY_TITLE_RAW)) { 
     title_raw = intent.getStringExtra(SBooksDbAdapter.KEY_TITLE_RAW); 
     ... do all that other stuff ... 
    } 
} 
+0

Shaun K. 정말 고마워요. 코드로 정말 작동합니다! – Dennie

2

하여 onActivityResult로 일부 기록에 넣어보십시오 (...) 주요 활동의 방법. 하위 액티비티의 '뒤로'버튼은 결과 코드 RESULT_CANCELED를 제공 할 수 있으며이 경우 의도는 null 일 수 있습니다. NPE를 받게됩니다.

번들 번들 = intent.getExtras();

+0

"로깅"이란 무엇을 의미합니까? 어떻게해야할지 모르겠다. – Dennie

+0

쉬운 방법은 System.out.println ("+++++++++++++"+ resultCode); 콘솔에서 "adb -e logcat"을보고 plusses를 찾습니다. – Nate

+1

Log 클래스를 사용하는 것이 좋습니다 (그리고 똑같이 쉬운) 방법은'Log.i ("your-log-tag", "your message");'입니다. LogCat에서 로깅을 볼 수 있으며 자신의 메시지 만 볼 수 있도록 "your-log-tag"에 대한 필터를 설정할 수도 있습니다. – Ridcully

관련 문제