2011-12-20 7 views
1

나는 별도의 클래스에서 정의 된 ViewFlipper 있습니다. 그것은 다음과 같습니다안드로이드 findViewById throw NullPointerException

public class Flipper extends Activity { 
    public ViewFlipper view_flipper; 

    /* Constructor */ 
    public Flipper(int flipper_id) { 
     view_flipper = (ViewFlipper) findViewById(flipper_id); 
    } 
    ... 

을 그리고 다른 활동의 onCreate() 방법에 나는이 같은 플리퍼를 인스턴스화하고 있습니다 :

private Flipper flipper; 
flipper = new Flipper(R.id.login_screen_flipper); 

는 그러나, 나는 플리퍼의 생성자에 NullPointerException를 얻을. 디버그 할 때 flipper_id에 유효한 ID가 있음을 알았습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

1

다른 활동에서 Flipper를 인스턴스화하면 Flipper 생성자에서 findViewById가 호출됩니다. Activity를 확장 할 때 Flipper 클래스의 메서드입니다. Activity.onCreate에서 일반적으로 수행되는대로 내용 뷰를 설정하지 않기 때문에 생성자에서 해당 호출이 유효하지 않은 것입니다. Flipper는 Activity를 확장해서는 안되며 id가 아닌 생성자에서 ViewFlipper를 전달해야합니다.

+0

감사합니다. 나는 Flipper를 다음과 같이 인스턴스화했다. flipper = 새로운 Flipper ((ViewFlipper) findViewById (R.id.login_screen_flipper), res); –

3

이와 같은 활동을 생성 할 수 없습니다.

활동을 만들려면 Intents을 사용해야합니다. 그리고 XML 파일에 레이아웃을 정의하고 setContentView (R.layout.layout_name)를 사용하여 첨부해야합니다.

이 봐 학습을 시작해야합니다 : https://developer.android.com/training/index.html


UPDATE :

OK, 당신이 당신의 질문의 정보와 달성하는 것의 불분명합니다. 그런 다음

package your.package; 

public class MyFlipper extends ViewFlipper { 
    // ... 
} 

을이처럼 XML에서 사용 : 당신이 ViewFlipper의 동작을 확장 할 경우

내가 제안 당신은 그것을 확장

<your.package.ViewFlipper 
    [...] parameters [...] /> 

그리고 당신이 그것을 구현할 때 마지막으로 당신이 할 수 있습니다 그것은 다음과 같습니다 :

public class YourActivity extends Activity { 

    public ViewFlipper viewFlipper; 

    @Override 
    protected void onCreate (Bundle savedInstanceState) { 
     viewFlipper = (ViewFlipper) findViewById(R.id.login_screen_flipper); 
    } 

    // ... more activity stuff 
} 

추 신 : lowerCamelCase을 사용하는 것이 좋습니다. Java 멤버 변수 (Java의 필드)의 표기법

+0

Flipper 클래스가 Activity를 확장하지 않는다고 가정하십시오. 재사용 가능한 ViewFlipper 클래스라고 가정합니다. 그렇다면 왜 내가 의도가 필요한가요? –

관련 문제