ButterKnife onClick自定义视图

时间:2016-02-05 06:01:06

标签: android butterknife

我创建了一个自定义按钮并尝试使用ButterKnife @onClick注释,但它无效。

是否可以将ButterKnife用于此类自定义视图,或者我必须使用默认的onClickListener

的CustomButton

public class CustomButton extends RelativeLayout {

public CustomButton(Context context) {
    super(context);
}

public CustomButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public CustomButton(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public CustomButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    init();
}

private void init() {
    inflate(getContext(), R.layout.button_layout, this);
}

菜单

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final View rootView = inflater.inflate(R.layout.fragment_menu, container, false);
    ButterKnife.bind(this, rootView);
    return rootView;
}

@OnClick(R.id.button_play)
public void onButtonPlayClicked() {
    // NOT CALLED
}

菜单布局

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_pattern"
android:padding="15dp">

<com.example.ui.custom.CustomButton
    android:id="@+id/button_play"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"/>
</RelativeLayout>

5 个答案:

答案 0 :(得分:3)

目前,我遇到了同样的问题并找到了一个非常好的解决方案。 我在视图中覆盖 setOnClickListener(OnClickListener l),并将侦听器分配给我的按钮。之后 @OnClick 按预期工作。

在您的情况下,您可以添加下一个方法:

@Override
public void setOnClickListener(OnClickLister l) {
   ButterKnife.findById(this.getView(), R.id.button_play).setOnClickLister(l);
}

答案 1 :(得分:2)

来自http://jakewharton.github.io/butterknife/

  

自定义视图可以通过不指定ID来绑定到自己的侦听器。

public class FancyButton extends Button {
    @OnClick
    public void onClick() {
        // TODO do something!
    }
}

希望它有所帮助!!

答案 2 :(得分:2)

我遇到了同样的问题。我通过在自定义视图中处理事件调度解决了问题。

在你的情况下:

public class CustomButton extends RelativeLayout {

    // ...

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_UP) {
            if(hasOnClickListeners()) {
                callOnClick();
            }
        }
        return super.dispatchTouchEvent(event);
    }

    // ...

}

希望这可以提供帮助。

答案 3 :(得分:2)

我有同样的问题,我找到了解决方法!

将自定义视图的XML( R.layout.button_layout )的根视图替换为使用<merge>。正如您可以在ButterKnife文档中看到的那样:

  

使用ButterKnife.bind(this)将视图中的孩子绑定到字段中。 如果您在布局中使用<merge>标记并在自定义视图构造函数中充气,则可以在之后立即调用此标记。或者,从XML中膨胀的自定义视图类型可以在onFinishInflate()回调中使用它。

在我的情况下,我更换了:

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_button_default"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/normal_padding"
tools:background="@color/white"
tools:layout_height="80dp">

人:

<merge
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

现在,父视图配置位于CustomView初始化方法中。所有OnClick和OnLongClick事件都在工作!

希望这有帮助!

答案 4 :(得分:-1)

In your activity try to add..

 ButterKnife.inject(this);
check this code

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
}

@OnClick(R.id.buttonAlert)
public void alertClicked(View v){
new AlertDialog.Builder(v.getContext())
    .setMessage(getFormattedMessge())
    .setNeutralButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
        dialog.dismiss();
        }
    })
    .show();
 }