如何使用ButterKnife注入ViewStub?

5

我想使用ViewStub和ButterKnife,这是我所做的:

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 是一个空对象引用

我现在毫无头绪,欢迎任何建议。谢谢!


1
尝试使用以下代码:View inflated = mStub.inflate(); ButterKnife.inject(this, inflated); - Nikola Despotoski
@NikolaDespotoski 我已经尝试过了,这个注入替换了第一个注入ButterKnife.inject ( this, rootView );,所以mStub变成了null。现在我使用TextView mText = ( TextView ) inflated.findViewById ( R.id.text );代替了:( 无论如何还是谢谢! - RockerFlower
@RockerFlower,加载布局后为什么还需要ViewStub对象呢? - Renascienza
2个回答

7

你可以创建一个嵌套类,将视图放在存根内部。

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

4

这里是Jake针对此请求的回答:

创建一个嵌套类,将视图放在存根中,然后使用viewstub作为根,在该类的实例上调用inject。

有关代码,请参阅此Github问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接