[英]Android: OnClick not work when override onClick in customView
我創建了一個自定義視圖。 我的自定義視圖從RelativeLayout
擴展:
public class CircleProgressButton extends RelativeLayout {...
在我的自定義視圖中,我有一個按鈕:
private void initView(Context context, AttributeSet attrs) {
TypedArray typedArray = context.getTheme().obtainStyledAttributes(
attrs, R.styleable.ProgressButton, 0, 0
);
try {
progressHeight = typedArray.getInt(R.styleable.ProgressButton_progress_height, progressHeight);
progressWidth = typedArray.getInt(R.styleable.ProgressButton_progress_width, progressWidth);
progressIconSuccess = typedArray.getResourceId(R.styleable.ProgressButton_progress_iconSuccess, R.drawable.ic_done);
progressIconFail = typedArray.getResourceId(R.styleable.ProgressButton_progress_iconfail, R.drawable.ic_fail);
progressText = typedArray.getString(R.styleable.ProgressButton_progress_text);
progressBackgroundImage = typedArray.getDrawable(R.styleable.ProgressButton_progress_button_background);
} finally {
typedArray.recycle();
}
initButton();
initProgressBar();
initImageView();
}
private void initButton() {
button = new AppCompatButton(getContext());
LayoutParams button_params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
button_params.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
button.setLayoutParams(button_params);
button.setText(TextUtils.isEmpty(progressText) ? "Button" : progressText);
button.setGravity(Gravity.CENTER);
StateListDrawable background = new StateListDrawable();
background.addState(StateSet.WILD_CARD, progressBackgroundImage);
// background.addState(new int[]{android.R.attr.state_pressed}, progressBackgroundImagePressed);
button.setBackground(background);
button.setClickable(false);
/* button.setOnClickListener(v -> {
if (imageView.getVisibility() == VISIBLE) imageView.setVisibility(GONE);
progressBar.setVisibility(VISIBLE);
});*/
addView(button);
}
現在我將自定義視圖附加到片段布局:
<com.tazik.circleprogressbutton.CircleProgressButton
android:id="@+id/btn_save"
android:layout_width="150dp"
android:layout_height="70dp"
app:progress_height="30"
app:progress_width="30"
app:progress_text = "@string/save_btn"
app:progress_iconfail="@drawable/ic_fail"
app:progress_iconSuccess="@drawable/ic_done"
app:progress_button_background="@drawable/mybutton"
android:clickable="true"/>
在我的片段中,我像這樣綁定片段布局:
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_marhaleh, container, false);
binding.btnSave.setOnClickListener(v->{
Log.i("======", "onSaveClicked: ");
// do my stuff
});
運行應用程序並單擊btnSave
,logcat上將顯示日志。
現在,我想在自定義視圖中覆蓋OnClick,以便按順序在我的自定義視圖中實現View.OnClickListener
:
public class CircleProgressButton extends RelativeLayout implements View.OnClickListener {
private OnClickListener listener;
@Override
public void setOnClickListener(@Nullable View.OnClickListener l) {
listener = l;
}
而且我覆蓋onClick:
@Override
public void onClick(View v) {
if(listener != null){
if (imageView.getVisibility() == VISIBLE) imageView.setVisibility(GONE);
progressBar.setVisibility(VISIBLE);
}
}
現在在運行應用程序后,當我單擊btnSave
日志時未出現,這意味着
binding.btnSave.setOnClickListener(v->{
Log.i("======", "onSaveClicked: ");
// do my stuff
});
不工作嗎? 怎么了?
試試這個對我有用的方法,在CircleProgressButton類中添加以下功能:
private void init(){
setOnClickListener(this);
}
並在所有構造函數上調用init()。 刪除這個
@Override
public void setOnClickListener(@Nullable View.OnClickListener l) {
listener = l;
}
像這樣編輯此方法:
@Override
public void onClick(View v) {
if (imageView.getVisibility() == VISIBLE) imageView.setVisibility(GONE);
progressBar.setVisibility(VISIBLE);
}
觸發按鈕onclick
binding.btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
binding.btnSave.onClick(v);
Log.i("======", "onSaveClicked: ");
//code
}
});
在這之后應該工作
如果您使用數據綁定,請嘗試此
<com.tazik.circleprogressbutton.CircleProgressButton
android:onClick="@{()->viewModel.click()}"
.........../>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.