如何使用ButterKnife注入ActionBar自定义视图?

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

我希望在actionbar中包含的视图上绑定onclick监听器。传统的方式如下:

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

预期的ButterKnife用法:

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

如何在我的情况下使用ButterKnife方式?
1个回答

9

看起来你误解了 ButterKnife 的核心机制。一般情况下,你在注释中使用的所有 ids 都是你正在使用的活动/片段类的视图的 ids。

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将尝试为每个已注释的字段/方法注入两次(对于活动/片段布局,然后是对于actionbarView)。因此,我不建议您使用此解决方案。但是,如果您喜欢它,请查看ButterKnife @Optional注释,它可以使您免于ButterKnife在冲突情况下抛出的异常。

而且,我不确定在这种情况下是否存在memleaks(方法类似于片段的注入)。因此,最好在正确的时刻手动调用ButterKnife.release(actionbarView)(我无法确切地说何时,也许是在onDestroyView()内部)。

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


注入到ActionBar不起作用 :-) 只有findById选项对我有效。 - voghDev

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