butterknife如何注入actionbar自定义视图?

Wei*_*ibo 2 android butterknife

我在我的项目中使用ButterKnife,它很棒.

我可以通过ButterKnife.inject(this)在我的Activity中注入内容视图,我也在我的操作栏中使用自定义视图:

private void configActionbar() {
    ActionBar actionBar = getSupportActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setDisplayShowCustomEnabled(true);
    View actionbarView = LayoutInflater.from(this)
            .inflate(R.layout.actionbar_view, null);
    actionBar.setCustomView(actionbarView);
}
Run Code Online (Sandbox Code Playgroud)

我想在操作栏中包含的视图上绑定onclick侦听器.传统方式如下:

Button a = (Button)actionbarView.findViewById(R.id.btn);
a.setOnClickListener(xxxx) ;
Run Code Online (Sandbox Code Playgroud)

期待的ButterKnife方式:

@OnClick(R.id.btn)
public void btnClick(){....}
Run Code Online (Sandbox Code Playgroud)

如何在我的情况下使用ButterKnife方式?

Met*_*ore 8

似乎你误解了核心ButterKnife力学.在一般情况下,您在注释中使用的所有ID都是您使用的类的活动/片段视图的 ID .

LayoutInflater.from(this).inflate(R.layout.actionbar_view, null)给你另一个View看起来ButterKnife无法达到的观点.

在这种情况下,ButterKnife可能为您做的最好的事情是方便的findById方法.看看这段代码:

private void configActionbar() {
    ...

    View actionbarView = LayoutInflater.from(this)
            .inflate(R.layout.actionbar_view, null);
    actionBar.setCustomView(actionbarView);

    // Yep, this is best ButterKnife can do for you
    Button button = ButterKnife.findById(actionbarView, R.id.btn);
    // And then old fashion Android code...
    button.setOnClickListener(...);
}
Run Code Online (Sandbox Code Playgroud)

编辑:

哦,我有个主意.我们来试试下一个代码:

View actionbarView = LayoutInflater.from(this)
        .inflate(R.layout.actionbar_view, null);
actionBar.setCustomView(actionbarView);

ButterKnife.inject(actionBar, actionbarView); // actionBar as argument is for keep track of injection. Read about memleak below.
Run Code Online (Sandbox Code Playgroud)

但请记住,在这种情况下,您可能会遇到一些冲突,因为ButterKnife会尝试两次注入每个带注释的字段/方法(对于一个活动/片段布局,然后是一个actionbarView).所以我不建议你使用这个解决方案.但是如果你喜欢它,看看ButterKnife @Optional注释,它可以让你免受ButterKnife在发生冲突时抛出的异常.

在这种情况下我不确定memleaks(方法就像注入片段一样).所以,很可能你应该ButterKnife.release(actionbarView)在适当的时候手动打电话(我不能确切地说,何时,也许在里面onDestroyView()).

在ButterKnife冲突下,我的意思是当ButterKnife找不到带注释的字段/方法的视图或者几个注入的视图包含具有重复ID的子视图时的情况