设置为可见性的按钮仍然可以单击

时间:2019-06-01 19:09:49

标签: android android-button

在我的活动中,我有一个开关,当选中该开关时会创建一个动画,并且屏幕上会出现一个按钮。禁用开关后,该按钮也随动画一起消失。当按钮消失时,我将可见性设置为走了,当它出现时,我将可见性设置为可见。 按钮的初始状态已消失,当我尝试单击该位置时,应该没有任何反应。当按钮出现时,它变为可单击的。如果我再次使其消失,则仍然可以单击。这是为什么?我认为将可见性设置为“消失”可以防止按钮被触发。我知道我可以将按钮设置为setEnabled(false),但我很好奇为什么在将按钮的可见性设置为“消失”时仍可单击该按钮。

这是我的onCreate()

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        handler = new Handler();
        show = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.show);
        hide = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.hide);
        ((SwitchCompat)findViewById(R.id.animation_switch)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            ((AppCompatButton)findViewById(R.id.animated_button)).startAnimation(show);
                            ((AppCompatButton)findViewById(R.id.animated_button)).setVisibility(View.VISIBLE);                      
                        }
                    }, 3000);

                }else{
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            ((AppCompatButton)findViewById(R.id.animated_button)).startAnimation(hide);
                            ((AppCompatButton)findViewById(R.id.animated_button)).setVisibility(View.GONE);                             
                        }
                    },3000);
                }
            }
        });

        ((AppCompatButton)findViewById(R.id.animated_button)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "Button Clicked", Toast.LENGTH_LONG).show();
            }
        });

这里是布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="36dp"
        android:layout_marginTop="32dp"
        android:text="Animataion"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <android.support.v7.widget.SwitchCompat
        android:id="@+id/animation_switch"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="32dp"
        android:layout_marginTop="24dp"
        android:checked="false"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/notification_switch" />

    <android.support.v7.widget.AppCompatButton
        android:id="@+id/animated_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="176dp"
        android:text="click me"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:visibility="gone"/>
</android.support.constraint.ConstraintLayout>

这是放映动画:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true">
    <scale
    android:duration="450"
    android:fromXScale="0.0"
    android:fromYScale="0.0"
    android:toXScale="1.0"
    android:toYScale="1.0"
    android:pivotX="50%"
    android:pivotY="50%"
    />
</set>

这是隐藏动画:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true">
    <scale
    android:duration="300"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:toXScale="0.0"
    android:toYScale="0.0"
    android:pivotX="50%"
    android:pivotY="50%"
    />
</set>

2 个答案:

答案 0 :(得分:1)

如果在动画之后设置setVisibility(View.GONE),请尝试在动画末尾使用clearAnimation()清除视图上的动画

mview.clearAnimation()

OR

这在初始化动画时也可以使用,因为动画存在一些错误。

show = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.show);
hide = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.hide);
show.setFillAfter(false);
hide.setFillAfter(false);

答案 1 :(得分:0)

尝试这样的事情

hide = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.hide);
hide.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {}

    @Override
    public void onAnimationEnd(Animation animation) {
        ((AppCompatButton)findViewById(R.id.animated_button)).setVisibility(View.GONE);
        ((AppCompatButton)findViewById(R.id.animated_button)).setEnabled(false); 
    }

    @Override
    public void onAnimationRepeat(Animation animation) {}
});