2011-11-02 6 views
8

私はこの1つのアクティビティのレイアウトが異なります。複数のレイアウトで動作しないInjectview(Roboguice)

私はそれぞれが開いてレイアウトを使ってそれぞれのクラスを開きます。

これらのクラスを@Inject経由でアクティビティに挿入します。これは問題ありません。

しかし、アクティブでないレイアウトにあるコントロールの1つで@InjectViewを使用しようとすると、エラーが発生します。

11月2日19:17:31.086:ERROR/AndroidRuntime(1326): java.lang.NullPointerExceptionが:によって引き起こさクラス be.baes.notes.View.EditNoteImplにヌル値を注入することはできません。フィールドが@ Nullableでない場合の.saveButton

これはコードになります。

public class EditNoteImpl implements EditNote { 
    @Inject CancelEditNoteClickListener cancelEditNoteClickListener; 
    @Inject SaveNoteClickListener saveNoteClickListener; 
    @Inject Provider<Activity> activity; 
    @InjectView(R.id.saveButton) Button saveButton; 

    /* (non-Javadoc) 
    * @see be.baes.notes.EditNote#activateEditNote() 
    */ 
    @Override 
    public void activateEditNote() 
    { 
     activity.get().setContentView(R.layout.editnote); 

     this.saveButton.setOnClickListener(saveNoteClickListener); 
    } 
} 

私はこれを行うことができます。

public class EditNoteImpl implements EditNote { 
    @Inject CancelEditNoteClickListener cancelEditNoteClickListener; 
    @Inject SaveNoteClickListener saveNoteClickListener; 
    @Inject Provider<Activity> activity; 
    private Button saveButton; 

    /* (non-Javadoc) 
    * @see be.baes.notes.EditNote#activateEditNote() 
    */ 
    @Override 
    public void activateEditNote() 
    { 
     activity.get().setContentView(R.layout.editnote); 
     saveButton = (Button)activity.get().findViewById(R.id.saveButton); 

     this.saveButton.setOnClickListener(saveNoteClickListener); 
    } 
} 

これを行う良い方法がありますか?

+0

Button @ Nullableを作成する理由はありませんか? –

+0

私はそれを試みましたが、それはボタンのどちらも注入しません。 – chrissie1

+0

RoboGuice 2.0を使用していますか?これは* 2.0 *で動作する可能性があります – emmby

答えて

4

私はちょうどより多くの経験を持つ他の誰かがより良い答えを与えることができるかもしれないのでroboguiceを使用し始めているが、これは私がこれまでに見つけたものです:roboguice-1.1.2では

  • (現在の安定リリース)、@InjectViewのアイテムは、アクティビティで初めてsetContentView()が呼び出されたときにのみ注入されます。あなたのコードは補助クラスからsetContentView()を動的に呼び出すので、注入された項目は正しく注入されません。

  • roboguice-2.0b2(現在のベータ版)では、setContentView()複数の呼び出しがサポートされており、コードは機能するはずです。ただし、注入されたビューはまだコンテキストアクティビティ(宣言クラスではなく)に結び付けられているため、@InjectViewは、同じアクティビティを共有するすべての補助クラスにわたって@Nullableである必要があります。単一の活動で

ここでの問題は、複数のレイアウトに根ざしているように見える(したがって、複数のsetContentView()通話)ので、あなたが欲しいものを行うための一つの代替の方法は、次のようにそれを避けるためです:

    代わりに、いくつかのレイアウトを有する
  • 、親でframeLayoutにすべてのレイアウトをロードする<include/>タグを使用して単一のレイアウトを使用:
<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <include layout="@layout/layout1" /> 

    <include layout="@layout/layout2" /> 

    <!-- other layouts... --> 

</FrameLayout> 
  • 、その後、代わりにsetContentView()を呼び出し、このような何か、活動に目に見えるレイアウトを切り替えることができますメソッドを使用します。
// instead of: activity.setContentView(R.layout.layout1); 
// use: activity.showLayout(R.id.layoutview1); 
public void showLayout(int layoutViewId) { 
    final View view = findViewById(layoutViewId); 
    final ViewGroup root = (ViewGroup) view.getParent(); 
    for (int i = 0; i < root.getChildCount(); i++) { 
     final View v = root.getChildAt(i); 
     v.setVisibility(v == view ? View.VISIBLE : View.GONE); 
    } 
} 

上記の代替がために働く必要があります安定版とベータ版の両方をリリースしています。ここでのトレードオフは、複数の異なるタイミングでそれぞれのレイアウトを読み込むのではなく、同時に複数のレイアウトを読み込むことです。それは私のために十分にうまくいくようです(あなたのニーズに応じて異なるかもしれませんが)。私は注意してください

ことの一つは、現在の"Upgrading from RoboGuice 1.1 to 2.0"ページで、次のように述べていることである。

あなたが RoboGuice.injectMembersを呼び出す必要がありますが、(ビューで@InjectViewを使用する機能() RoboViewベースの クラスがないため、おそらく決してなりません)。

(それらは以下の活動に結びついているので、それらを@Nullableであるためには、できれば不要)あなたが見るに由来するとあなたの補助クラスを実装することを可能にするとその中@InjectViewが良く動作させる必要があると思われません。しかし、現在のコードを見ると、この機能はまだ実装されていないようです(間違った場所を見ている可能性もありますが)。

関連する問題