2011-12-20 20 views
1

別のクラスで定義されたViewFlipperがあります。それは次のようになります。Android 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を別のアクティビティでインスタンス化すると、findViewByIdがFlipperのコンストラクタで呼び出されます。これはFlipperクラスのメソッドで、Activityを継承しているため、通常は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を、それはあなたがあなたの質問の情報を達成しているかの不明です。

あなたは私はあなたがそれを拡張示唆ViewFlipperの振る舞いを拡張する場合:

package your.package; 

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

次に、このようなあなたのxmlでそれを使用します。

<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 
} 

PS:それはlowerCamelCaseを使用するためには良い習慣ですJavaメンバー変数(またはJavaのフィールド)の表記

+0

Flipperクラスがアクティビティを拡張しないとします。再利用可能なViewFlipperクラスだとします。それではなぜ私はそのような意図が必要でしょうか? –

関連する問題