在片段转换时,您如何禁用用户点击?

时间:2015-09-16 07:38:23

标签: android android-fragments onclicklistener

我希望我的片段在片段转换动画尚未完成时不会对视图进行任何点击。这只是一个简单的褪色。但是当我在下一个片段渐渐消失的情况下立即按下任何视图时,事情会变得很糟糕。

有任何想法如何实现这一点?

3 个答案:

答案 0 :(得分:2)

这实际上是在我自己的应用中使用的。这个想法非常简单,只是有效,但还需要很多额外的编码。

这个想法很简单,使用布尔变量来维护屏幕是否应该被锁定,让我们称之为screenLocked。我实际上并没有阻止点击,但让点击什么都不做。

对于那些需要时间的操作,在开始工作之前将screenLocked设置为true,并在任务完成时将其设置为false。此外,您必须在执行任何操作之前添加screenLocked检查。

这种方法的另一个难点是你需要有明确的任务终点。以Fragment转换为例,如果backstack是poped,那么在这种情况下没有实际的回调通知你。为了解决这个问题,我会在开始片段转换之前设置另一个标志releaseOnResume,在onResume中,我会使用此标志来检查是否应该将screenLocked设置为false。

我尝试但未使用的其他解决方案:

在我解决之前提到的方法之前,我尝试过setEnabledsetClickable或任何基于UI的阻止,例如在顶部添加FrameLayout并捕获所有触摸事件。

这些方法并不错,特别是考虑到它们易于实现。

唯一的问题是,由于双击onClick事件可能会排队,当您处理第一个onClick事件时,实际上可能有另一个事件排队即使您进行任何用户界面更改立即以阻止任何进一步的点击,您也无法阻止下一个onClick事件,因为它已经排队了。

希望这有帮助。

答案 1 :(得分:1)

我使用倒数计时器。 我通过ontouch监听器来管理它。

我创建了一个管理计时器创建的方法。我在ontouch活动中称之为。我使用两种方法(这是可选的,但有利于可扩展性)来处理按钮启用和禁用。然后我使用这些方法与计时器启用和禁用按钮。

请参阅我的代码段。

在oncreate中:

 @Override protected void onCreate(Bundle savedInstanceState) {
   /.../
    button.setOnTouchListener(new View.OnTouchListener() {
        @Override public boolean onTouch(View v, MotionEvent event) {
            disableButton(button);
            countDwn1();
            /... time to do whatever you need..

            // custom methods...

            fragment = new MyFragAddFragment();
            replaceFragment(fragment);
            return false;
        }
    });

方法:

public void countDwn1() {
    CountDownTimer countDownTimer = new CountDownTimer(2000, 1000) {
        public void onTick(long millisUntilFinished) {
        }

        public void onFinish() {
            enableButton(button);
        }
    }.start();
}


public void disableButton(Button button) {
    button.setEnabled(false);
}

public void enableButton(Button button) {
    button.setEnabled(true);
}

您可以扩展此方法以包括将按钮作为参数传递到计时器中,以实现可扩展性。

答案 2 :(得分:1)

最后我使用了这样的东西。我为我的所有片段创建了一个父类,并覆盖了每个动画上调用的OnCreateAnimation方法。

@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
    //Check if the superclass already created the animation
    Animation anim = super.onCreateAnimation(transit, enter, nextAnim);

    //If not, and an animation is defined, load it now
    if (anim == null && nextAnim != 0) {
        anim = AnimationUtils.loadAnimation(getActivity(), nextAnim);
    }

    //If there is an animation for this fragment, add a listener.
    if (anim != null) {
        anim.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                isAnimationFinished = false;
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                isAnimationFinished = true;
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
    }

    return anim;
}

isAnimationFinished变量是一个公共变量,可供调用活动和子类使用