Как передать CheckedChange Listener в пользовательское представление - PullRequest
0 голосов
/ 14 февраля 2020

Обновление от 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
            }
        });
    ...
}

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

0

Обновление от 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/

Я читаю этот блог, чтобы понять это. и я ценю это.

0 голосов
/ 14 февраля 2020

Вам необходимо вызывать свой CheckedChangeListener самостоятельно

т.е.

...