2011-11-13 3 views
7

Android 프로그래밍을 시작하려고합니다. 책에서 몇 가지 예를 들었습니다. 이러한 예에 에서 다음 코드를 삽입하도록 요청 : 번들 객체는 항상이 경우에 널 왜onCreate()에서 번들 객체가 항상 null 인 이유는 무엇입니까?

public class ExemploCicloVida extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     Log.i(TAG, getClassName() + " onCreate() called on: " + icicle); 

     TextView t = new TextView(this); 
     t.setText("Exemplo de ciclo de vida de uma Activity.\nConsulte os logs no LogCat"); 
     setContentView(t); 
    } 
} 

내가 궁금합니다.

답변

13

이전에 저장된 상태가 없으면 번들은 null이됩니다.

이것은 Activity API documentation에 언급되어 있습니다.

2

이 코드를 실행하고 Ctrl + F11을 눌러 화면을 회전하십시오. 번들은 null이되지 않습니다.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    if (savedInstanceState != null) { 
     Toast.makeText(this, savedInstanceState.getString("s"), 
       Toast.LENGTH_LONG).show(); 
    } 
} 

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

    outState.putString("s", "hello"); 
} 

onSaveInstanceState(Bundle)이 호출됩니다. 그런 다음 activity 객체가 만들어지고 이 null이 아닌 Bundle savedInstanceState과 함께 호출됩니다.

+1

감사 wannik. API는 내게도 단서를 주었고, 당신의 코드도 입력 해주었습니다. Ctrl + F11을 입력하면, 고드름은 더 이상 null이 아닙니다. –

8

내 경우 엔 특정 활동에 매니페스트 파일에 선언 된 테마가 없었기 때문입니다.

이 문제를 해결하려면 AndroidManifest.xml을 열고 Application을 클릭하고 Application Nodes에서 충돌하는 활동을 선택하고 Att 테마의 테마 필드에 테마를 추가합니다. 내 경우에는

@style/Theme.AppCompat.Light.DarkActionBar 

이었지만 다른 활동 중 하나에서 테마를 복사 할 수있었습니다.

P .: 나는 이것이 이전 질문에 대한 답이라고 알고 있지만 수정을 검색하는 동안 우연히 발견되어 다른 사람들에게 도움이 될 수 있도록 실제 해결책을 찾지 못했습니다.

+1

이것에 대한 귀하의 의견을 진심으로 감사드립니다 !!! 당신은 저에게 많은 두통을 덜어 줬습니다 ... 나는 이전의 활동에서 주제를 바꿨지 만, 널 포인터를 얻는 활동에서 그 주제를 바 꾸었습니다! 나는 이것이 결코 문제가되지 않는다는 것을 결코 꿈꾸지 않았을 것입니다! 다시 ... cead mile failte! –

+0

대단히 환영합니다! 나는 그것을 이해하기 위해 많은 시간을 낭비했다. 그래서 누군가가이 모든 것을 통과하지 못하게하는 데 도움이되었다는 소식을 듣게되어 기쁩니다! –

0

활동에 참여하는 매개 변수를 읽고 싶습니다. 이 기능을 사용하십시오 :

protected String getStringExtra(Bundle savedInstanceState, String id) { 
String l; 
l = (savedInstanceState == null) ? null : (String) savedInstanceState 
      .getSerializable(id); 
if (l == null) { 
    Bundle extras = getIntent().getExtras(); 
    l = extras != null ? extras.getString(id) : null; 
} 
return l; 
} 
관련 문제