是否可以編寫一個函數,該函數僅在其參數中獲取Activity並且可以響應該活動中按下的所有按鈕?收聽我的活動中的所有按鈕(僅限活動參數)
我試過通過ViewTreeObserver註冊一些東西,也許使用decorView但沒有成功。
是否可以編寫一個函數,該函數僅在其參數中獲取Activity並且可以響應該活動中按下的所有按鈕?收聽我的活動中的所有按鈕(僅限活動參數)
我試過通過ViewTreeObserver註冊一些東西,也許使用decorView但沒有成功。
是的。你的活動必須
implements OnClicklistener
,並有方法
public void onClick(DialogInterface di, int which) {
}
那麼你可以
button.setOnClickListener(this);
只要點擊任何按鈕(如果您已設置this
爲收聽的onclick方法會被調用)。 int which
參數是按鈕按下的ID。
編輯:我覺得我得到了你的問題錯了: -/
是其可能的。這個想法是:
您可以在該Activity中定義一個接口。例如:
public interface listener {public void method(Activity activity); }
在你的活動中,你應該公開一個註冊監聽器的註冊方法。
public void setListener(Listener listener) this.listener = listener; }
無論何時出現任何Button按鈕/點擊事件,都需要從Activity中調用接口方法。
exampleButton.setOnClickListener(新View.OnClickListener(){
@Override
public void onClick(View arg0) {
listener.listenToButton(this);
}
現在,任何一個類實現監聽器接口必須實現listenToButton(Activity activity)
方法和這種方式,他們會在任何按鈕獲得參考活動按(或點擊)事件
是的,這是可能的。你必須要找到你所有的按鈕,並設置其onClickListeners以相同的監聽器。要麼你可以讓你的活動實施View.OnClickListener或喲你可以通過實現它來創建一個監聽器對象。
瞭解您的活動的根佈局,您可以通過getChildAt(index)訪問子視圖。當然,你應該檢查一下孩子是否是Button
。
例如在onCreate
你可以做到這一點:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// a layout is a ViewGroup
ViewGroup mainLayout = (ViewGroup) findViewById(R.id.main_layout);
for (int i = 0; i < viewGroup.getChildCount(); i++) {
if (view instanceof Button) {
view.setOnClickListener(listener);
}
}
}
這裏的關鍵是要找到,即使他們是子佈局的孩子的所有按鈕。爲了這個目的,你必須寫一個像這樣的遞歸函數:
private void setListenerToAllButtons(ViewGroup viewGroup, View.OnClickListener listener) {
for (int i = 0; i < viewGroup.getChildCount(); i++) {
View view = viewGroup.getChildAt(i);
if (view instanceof ViewGroup) {
ViewGroup group = (ViewGroup) view;
setListenerToAllButtons(group, listener);
} else if (view instanceof Button) {
view.setOnClickListener(listener);
}
}
}
然後使用它是這樣的:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewGroup mainLayout = (ViewGroup) findViewById(R.id.main_layout);
setListenerToAllButtons(mainLayout, this);
}
按下或點擊? –