1

在我面向 Android 4.0.3 的应用程序中,我曾经有一个按钮用作开关。单击该按钮正在更改其资源(在播放/暂停之间切换),并且一些任务正在后台执行。特殊之处在于,当按下按钮时,我希望切换在短时间内不可用(以防止快速切换)。

为此,我创建了一个等待 X 秒的线程,如下所示:

void blockButton(){
    new Thread() {
        public void run(){
            try {
                        synchronized(this){
                             button_ready = false;
                             sleep(5000);
                             button_ready = true;
                        }
                }
                catch(InterruptedException ex){}
            }
        }.start();
    }
}

基本上在我的 Activity/onClickListener

if(button_ready){
    // Start background stuff
    changeButtonResource();
    button.setEnabled(false);
    blockButton();
    button.setEnabled(true);
}

到目前为止一切顺利,一切顺利。但我最终希望将其更新为 Switch。代码几乎相同(除了 onClickListener 变成了 OnCheckedChangeListener)。

但是现在当我单击一次按钮时,再次单击它将允许更改其资源-但后台任务将无法启动(我已经尝试使用振动器和其他人,它只会更改资源)。

所以我几乎拥有了我的 Button 曾经的行为,但是资源变得混乱了。任何想法都会受到欢迎!谢谢。

4

1 回答 1

1

您不需要创建另一个线程。View.postDelayed(Runnable)为您提供了一种在超时后启用按钮(或执行其他 UI 操作)的更简单方法。您的代码应如下所示:

class ... extends Fragment {
    private final Runnable enabler = new Runnable() { public void run() {
        button.setEnabled(true);
    }};

    private View button;

    public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {
        View result = ...
        button = result.findViewById(...);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                button.setEnabled(false);
                ...
            }
        });
        ...
    }

    public void onDestroyView() {
        ...
        button = null;
    }

    public void onPause() {
        ...
        button.removeCallbacks(enabler);
    }

    public void onResume() {
        ...
        button.setEnabled(true);
    }
}

removeCallbacks在您FragmentActivity离开之前调用对于避免用户在禁用期间离开引起的并发问题很重要。Fragment在这种情况下禁用回调后,重要的是要确保当用户返回到您的orActivityView恢复其保存的状态时,您不会“陷入”禁用状态。

于 2012-12-06T16:09:41.330 回答