2

Я написал составной компонент и добавлял пользовательский прослушиватель для реагирования.Пользовательский прослушиватель для составного компонента

Внутри класса для составного компонента, который использует файл xml.

public class VerticalCounterBlock extends LinearLayout { 

    public interface VerticalCounterBlockListener { 
     public void onCountChanged(int newCount); 
    } 

    private VerticalCounterBlockListener mVerticalCounterBlockListener = null; 

    public void setVerticalCounterBlockListener(VerticalCounterBlockListener listener){ 
     mVerticalCounterBlockListener = listener; 
    } 

    // ... Other functions 
} 

Я получил мой интерфейс, я получил слушатель, и я получил сеттер, и я привлечь слушатель, как это в кнопке я имею в составном компоненте. Я могу видеть, что тост, который показывает, когда я проверить

addBtn = (Button)findViewById(R.id.btn_addcount); 
addBtn.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     count++; 
     counttv.setText(String.format("%1$d", count)); 
     Toast.makeText(getContext(), "VCB", Toast.LENGTH_SHORT).show(); 
     if(mVerticalCounterBlockListener != null) { 
      mVerticalCounterBlockListener.onCountChanged(count); 
     } 
    } 
}); 

В моей основной деятельности

m20_vcb = (VerticalCounterBlock) findViewById(R.id.vcb_m20); 
m20_vcb.setVerticalCounterBlockListener(new VerticalCounterBlock.VerticalCounterBlockListener() { 
    @Override 
    public void onCountChanged(int newCount) { 
     increasePreachCountTotal(); 
     Toast.makeText(CounterActivity.this, String.format("%1$d", newCount), Toast.LENGTH_SHORT).show(); 
    } 
}); 

Я не вижу, что тост и не участвовать вызов функции. Что мне не хватает?

ответ

0

Я могу предложить вам несколько областей улучшения, в основном реструктурируя текущий формат.

Позволяет не поддерживать интерфейс как внутренний класс. Так вот ваш VerticalCounterBlockListener.java

public interface VerticalCounterBlockListener { 
    public void onCountChanged(int newCount); 
} 

Теперь реализовать эту interface в вашем MainActivity

public class MainActivity implements VerticalCounterBlockListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     m20_vcb = (VerticalCounterBlock) findViewById(R.id.vcb_m20); 
     m20_vcb.setVerticalCounterBlockListener(this); 
    } 

    // ... Other methods 

    // Override the onCountChanged function. 
    @Override 
    public void onCountChanged(int newCount) { 
     increasePreachCountTotal(); 
     Toast.makeText(CounterActivity.this, String.format("%1$d", newCount), Toast.LENGTH_SHORT).show(); 
    } 
} 

Вы могли бы рассмотреть вопрос удаления Toast из addBtn клик слушателя, который может создать исключение.

addBtn = (Button)findViewById(R.id.btn_addcount); 
addBtn.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     count++; 
     counttv.setText(String.format("%1$d", count)); 

     if(mVerticalCounterBlockListener != null) { 
      mVerticalCounterBlockListener.onCountChanged(count); 
     } 
    } 
}); 
+0

Все хорошие предложения. Я попробовал свой первый и использовал отдельный класс интерфейса. Это не помогло, поэтому я вернулся к своим соображениям и предпочтениям в организации. Может ли предложение 2/3 вызвать проблемы со слушателем? Я использовал только тост, потому что мой отладчик разорился и продолжал отключать. –

+0

Сегмент кода 2 показывает сохранение публичного слушателя внутри вашей «Деятельности». Вы тоже это попробовали? –

+0

Я пробовал, но это не сработало. Есть ли что-то с линейной компоновкой, которая предотвратила бы работу? –

0

Это было хорошо, что-то не так с моей системой. i uninstaklled приложение и перезагрузил компьютер, и он работал, как ожидалось.

Смежные вопросы