クリックするとすべて同じ onClick() メソッドをトリガーする 4 つのボタンを含むアクティビティがあります。そのメソッドの同時呼び出し/アクセスを防ぎたい。
- button1 がクリックされると、onClick() メソッドにより、スクロールする水平 Scrollview が数ピクセルスクロールされ、別のビューが表示されます。
- この新しく表示されたビューには、前の位置にスクロールして戻るための戻るボタンがあります。[この時点までは期待どおりに機能しています]。
問題:
アクティビティで 2 つのボタンが同時に (または数ミリ秒間隔で) 押された場合、最初のボタン クリックの実行が完了する前に、カスタム スクロール メソッドが再度呼び出されます。
試したケース:
- ボタンの onClick から UI スレッドで呼び出されるメソッドで、synchronizedキーワードを使用します。【動かない】
- onClick() の実行中に「静的ブール値フラグ」hasClickedを true に設定し、onClick() 内ですぐにチェックして、true の場合は返してみました。【動かない】
関連コード:
private OnClickListener mClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
int viewId = view.getId();
//Proshop top icon
if(viewId == R.id.proshop_icon){
if(hasClicked){
return;
}
hasClicked = true;
mProShopIconTop.startAnimation(proShopButtonAnimation());
if(mHScrollView.getCurrentChildIndex() == 0){
addAndMoveToSecondPage(mProshopPageView, true);
} else {
addAndMoveToSecondPage(mProshopPageView, false);
}
hasClicked = false;
}
//Tune top icon
else if(viewId == mTuneIconTop.getId()){
if(hasClicked){
return;
}
hasClicked = true;
mTuneIconTop.startAnimation(tuneButtonAnimation());
if(mHScrollView.getCurrentChildIndex() == 0){
addAndMoveToSecondPage(mTunePageView, true);
} else {
addAndMoveToSecondPage(mTunePageView, false);
}
hasClicked = false;
}
//bottom and top aiConnect button
else if(viewId == mAiConnect.getId() || viewId == mAiConnectIconTop.getId()){
if(hasClicked){
return;
}
hasClicked = true;
mAiConnectIconTop.startAnimation(aiConnectButtonAnimation());
if(mHScrollView.getCurrentChildIndex() == 0){
addAndMoveToSecondPage(mAIConnectPageView, true);
} else {
addAndMoveToSecondPage(mAIConnectPageView, false);
}
hasClicked = false;
}
//DR page play game button
else if(viewId == mPlayGame.getId()){
if(hasClicked){
return;
}
hasClicked = true;
playGolfClick();
addAndMoveToSecondPage(mGameMenuPageView, true);
hasClicked = false;
}
}
}
これは私が onClick から呼び出したコードです。
private void addAndMoveToSecondPage(View view, boolean withScroll){
mHScrollView.removePage(1);
mHScrollView.addPage(view, 1);
if(withScroll){
mHScrollView.moveToNextView();
}
view.setVisibility(View.VISIBLE);
}
mHScrollViewは、私がカスタマイズした HorizontalScrollView のインスタンスです。以下のメソッドを、HorizontalScrollView のサブクラスである CustomHorizontalScrollView に組み込みました。
public void moveToNextView(){
smoothScrollTo(getScrollX() + mScreenWidth, 0);
}
どんな助けでも大歓迎です..事前に感謝..!!