0

クリックするとすべて同じ onClick() メソッドをトリガーする 4 つのボタンを含むアクティビティがあります。そのメソッドの同時呼び出し/アクセスを防ぎたい。

  1. button1 がクリックされると、onClick() メソッドにより、スクロールする水平 Scrollview が数ピクセルスクロールされ、別のビューが表示されます。
  2. この新しく表示されたビューには、前の位置にスクロールして戻るための戻るボタンがあります。[この時点までは期待どおりに機能しています]。

問題:

アクティビティで 2 つのボタンが同時に (または数ミリ秒間隔で) 押された場合、最初のボタン クリックの実行が完了する前に、カスタム スクロール メソッドが再度呼び出されます。

試したケース:

  1. ボタンの onClick から UI スレッドで呼び出されるメソッドで、synchronizedキーワードを使用します。【動かない】
  2. 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は、私がカスタマイズした Horizo​​ntalScrollView のインスタンスです。以下のメソッドを、Horizo​​ntalScrollView のサブクラスである CustomHorizo​​ntalScrollView に組み込みました。

public void moveToNextView(){
    smoothScrollTo(getScrollX() + mScreenWidth, 0);
}

どんな助けでも大歓迎です..事前に感謝..!!

4

1 に答える 1