2014-12-26 30 views
4

我想使用ButterKnife一個ViewStub,這是我做了什麼:如何使用ButterKnife注入ViewStub?

public class ExampleFragment extends Fragment { 

    @InjectView (R.id.stub) 
    ViewStub mStub; 

    /* A TextView in the ViewStub */ 
    @InjectView (R.id.text) 
    @Optional 
    TextView mText; 

    @Override 
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View rootView = inflater.inflate (R.layout.rootview, container, false); 
     ButterKnife.inject (this, rootView); 

     mStub.setLayoutResource (R.layout.stub_layout); 
     View inflated = mStub.inflate(); 
     ButterKnife.inject (mStub, inflated); 

     mText.setText("test.");  

     return rootView; 
    } 
} 

和日誌說:

mText is a null object reference

我不知道現在,任何意見是受歡迎的。謝謝!

+1

嘗試'查看inflated = mStub.inflate(); ButterKnife.inject(this,inflated);' –

+0

@NikolaDespotoski我試過了,這個注入代替了第一次注入'ButterKnife.inject(this,rootView);',所以'mStub'變爲null。現在我用'TextView mText =(TextView)inflated.findViewById(R.id.text);'代替:(謝謝! – RockerFlower

+0

@RockerFlower,爲什麼在加載它的佈局後需要ViewStub對象呢? – Renascienza

回答

3

下面是從傑克的回答該請求:

創建保持該存根內的視圖的嵌套類,然後調用上使用viewstub作爲根的這個類的實例注入。

有關代碼,請參閱此Github問題。

6

您可以創建一個嵌套的類,它包含存根中的視圖。

public class ExampleFragment extends Fragment { 

    @InjectView (R.id.stub) 
    ViewStub mStub; 

    @Override 
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View rootView = inflater.inflate (R.layout.rootview, container, false); 
     ButterKnife.inject (this, rootView); 

     mStub.setLayoutResource (R.layout.stub_layout); 
     View inflated = mStub.inflate(); 
     MyStubView stubView = new MyStubView(inflated); 
     stubView.mText.setText("test.");  

     return rootView; 
    } 

    // class (inner in this example) that has stuff from your stub 
    public class MyStubView { 
     @InjectView(R.id.text) 
     TextView mText; 

     public MyStubView(View view) { 
      Butterknife.inject(this, view); 
     } 
    } 
}