我创建了一个自定义按钮并尝试使用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>
答案 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();
}