2011-11-02 2 views
8

그래서이 하나의 활동에 다른 레이아웃이 있습니다.여러 레이아웃으로 Injectview (Roboguice)가 작동하지 않습니다.

그리고 나는 각기 다른 레이아웃을 가지고 각각의 클래스를 열고 엽니 다.

@ Inject를 통해 활동에 이러한 클래스를 주입합니다. 이 모든 것은 문제가되지 않습니다.

그러나 비활성 레이아웃에있는 컨트롤 중 하나에서 @InjectView를 사용하려고하면 오류가 발생합니다.

11-02 19 : 17 : 31.086 : ERROR/AndroidRuntime (1326) java.lang.NullPointerException이 :에 의한 클래스 be.baes.notes.View.EditNoteImpl에 널 값을 삽입 할 수 없다 .saveButton 필드가 @Nullable이 아닌 경우

그러면 코드가됩니다.

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에서

  • 합니다 (현재 안정 릴리스), setContentView()이 활동에서 처음 호출 된 경우에만 @InjectView 항목이 주입됩니다. 코드에서 보조 클래스에서 setContentView()을 동적으로 호출하므로 주입 된 항목이 올바르게 주입되지 않습니다.

  • roboguice-2.0b2 (현재 베타)에서는 복수 setContentView() 호출을 지원하므로 코드가 작동해야합니다. 그러나 삽입 된 뷰는 컨텍스트 Activity (선언 클래스 대신)에 여전히 연결되어 있으므로 @InjectView은 모두 동일한 Activity를 공유하는 모든 보조 클래스에서 @Nullable이어야합니다.

      :

    문제가 여기에 것 때문에

    이 여러 레이아웃에 뿌리를두고하는 (따라서 여러 setContentView() 호출) 하나의 활동에이 하나의 대안 방법은 당신이 원하는 일을하기 위해 다음과 같이 그것을 방지하는 것입니다
<?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> 
대신 여러 레이아웃을 갖는
  • 는 부모 FrameLayout이로 모든 레이아웃을로드 할 <include/> 태그를 사용하여 단일 레이아웃을 사용
  • // 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); 
        } 
    } 
    

    위의 대안을 위해 일해야하는 대신 setContentView()를 호출

    • 다음,이 같은 활동에 보이는 레이아웃을 전환 할 방법, 뭔가를 사용 stable과 beta roboguice 릴리즈. 여기서 우리는 몇 가지 다른 시간에 각 레이아웃을로드하는 대신 여러 레이아웃을 동시에로드한다는 점에서 절충점이 있습니다. 그것은 나를 위해 충분히 잘 작동하는 것 같지만 (귀하의 필요에 따라 다를 수도 있음). 내가주의해야한다

      것은 현재 "Upgrading from RoboGuice 1.1 to 2.0" 페이지에서 다음과 같은 언급되어 있습니다 :

      당신이 RoboGuice.injectMembers를 호출해야하지만 (조회수에 @InjectView을 사용할 수있는 기능() roboView 기반 클래스가 없으므로 절대 없을 것입니다.

      는 당신이 당신의 보조 클래스 뷰에서 파생되는 구현하고 (그들은 덜 활동에 묶여 있기 때문에 그들이 @Nullable이 될 수 있도록 희망 필요) 그들 @InjectView이 더 잘 작동하지 않을 수 있도록 허용해야 것 같다. 그러나 현재 코드를 살펴보면이 기능은 아직 구현되지 않은 것 같습니다 (잘못된 장소를 볼 수도 있었지만).

    관련 문제