Обновление от 2020/02/17 Хорошо, я нашел решение. Причина, по которой пользовательский слушатель перестает работать в пользовательском классе, заключается в расположении файла XML. В прошлом весь мой успешный опыт строился на LinearLayout. Я упустил это в своем оригинальном описании проблемы. В новом файле пользовательского представления XML я использовал ConstraintLayout вместо LinearLayout. Это вызывает «ненормальное» поведение раздувания, которое используется для работы с LinearLayout.
В пользовательском классе представления LinearLayout, функции init (), я использовал
inflate(getContext(), R.layout.my_ll_custom_view,this);
Это не будет работать с ограничением. Я должен использовать следующий код,
View rootView = LayoutInflater.from(context).inflate(R.layout.my_cl_custom_view, this, false);
ConstraintSet constraintSet = new ConstraintSet();
this.addView(rootView);
ConstraintLayout.LayoutParams clp = new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
rootView.setLayoutParams(clp);
constraintSet.clone(this);
constraintSet.connect(rootView.getId(), ConstraintSet.LEFT, this.getId(), ConstraintSet.LEFT, 0);
constraintSet.connect(rootView.getId(), ConstraintSet.RIGHT, this.getId(), ConstraintSet.RIGHT, 0);
constraintSet.connect(rootView.getId(), ConstraintSet.TOP, this.getId(), ConstraintSet.TOP, 0);
constraintSet.connect(rootView.getId(), ConstraintSet.BOTTOM, this.getId(), ConstraintSet.BOTTOM, 0);
Более подробную информацию можно найти в https://jordan-dixon.com/2017/12/30/custom-views-with-constraint-layout-and-kotlin/
Я читаю этот блог, чтобы понять это. и я ценю это.
====== Исходное описание проблемы начинается здесь ======
Я сделал пользовательский вид с 3 кнопками переключения. В моем классе пользовательского представления я установил
public void setMyToggleButton1OnCheckedChangedListener(CompoundButton.OnCheckedChangeListener o) {
myToggleButton1.setOnCheckedChangeListener(o);
}
, но когда я пытаюсь справиться с этим даже в своей основной деятельности, похоже, что это событие никогда не вызывалось. В основном задании я попытался
myCustomView.setMyToggleButton1OnCheckedChangedListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
//TODO something here
}
else {
//TODO something here
}
}
});
Я попробовал другой пользовательский вид с обычной кнопкой и передал ему стандартное событие нажатия кнопки тем же методом. Я не понимаю, что отличает передачу стандартного события нажатия кнопки в настраиваемое представление и передачу прослушивателя события checkchange кнопки переключателя в настраиваемое представление.
PS: Вот что я сделал для обычной кнопки и ее OnClickListener. Это работает, как я и ожидал, поэтому я пытаюсь скопировать его на Toggle Button и OnCheckedChangeListener.
в myCustomView2 (пользовательское представление содержит обычные кнопки)
public class myCustomView2 extends ConstraintLayout{
private Button myRegBtn1;
...
public myCustomView2(Context context) {
this(context, null);
}
public myCustomView2(Context context, AttributeSet attrs) {
this(context, attrs, 0);
setAttributes(context, attrs);
}
public myCustomView2(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setAttributes(context, attrs);
init(context);
}
private void init(Context context) {
myRegBtn = findViewById(R.id.btn1);
...
}
private void setAttributes(Context context, AttributeSet attrs) {
...
}
public void setMyRegBtnOnClickListener(OnClickListener o) {
myRegBtn.setOnClickListener(o);
}
}
В моей основной функции,
public class myMainActivity extends AppCompatActivity{
private MyCustomView2 myCustomView2;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
...
myCustomView2.setMyRegBtnOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
//TODO: some code execute here when button clicked
}
});
...
}