3

我在我的项目中使用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);
}

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

Button a = (Button)actionbarView.findViewById(R.id.btn);
a.setOnClickListener(xxxx) ;

预期的黄油刀方式:

@OnClick(R.id.btn)
public void btnClick(){....}

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

4

1 回答 1

9

似乎您误解了核心 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(...);
}

编辑:

哦,我有个主意。让我们尝试下一个代码:

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.

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

在这种情况下,我不确定 memleaks(方法就像注入片段)。所以,很可能你应该在正确的时刻手动调用ButterKnife.release(actionbarView)(我不能确切地说什么时候,也许在里面onDestroyView())。

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

于 2014-08-13T19:57:59.303 回答