【问题标题】:Android View set to Visible and Gone in the same OnClick method, View never showing VisibleAndroid View 在同一个 OnClick 方法中设置为 Visible 和 Gone,View 从不显示 Visible
【发布时间】:2012-10-26 16:15:59
【问题描述】:

你好 stackoverflow 社区,

我在 droid 4.0.3 设备上使用 Android API 14。

在 Activity 中,我设置了一个 Button,以便在执行操作时在页面上显示 TextView。执行完动作后,我想让TextView再次消失。

button1.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
        // make textview visible 
        textView1.setVisibility(View.VISIBLE);      

        // perform action
        System.out.println("perform action");

        // make textview disappear
        textView1.setVisibility(View.GONE);
    }
});

如果我删除使 TextView 消失的部分,TextView 会按预期出现在窗口顶部,但我希望 TextView 出现 1-2 秒然后消失。

起初我想知道我是否需要做更多的工作而不仅仅是执行一个小动作,所以我尝试添加一个等待并打印出文本,但都没有奏效。等待总是调用异常,结束活动,当我打印出数字 1-1000 时,视图仍然永久消失。

有没有更好的方法让 TextView 在 OnClick 操作上出现和消失?

感谢您的帮助!

【问题讨论】:

    标签: android view visible


    【解决方案1】:

    这些命令是背靠背执行的。所以从技术上讲,它可能是可见的,但只有一两毫秒。您需要区分何时使视图可见以及何时隐藏它...


    您说您希望 TextView 在某种意义上“闪烁”,所以让我们使用作为每个 View 一部分的 Handler 来调用 Runnable。这个 Runnable 稍后会简单地隐藏 TextView:

    1) 设置类变量:

    Runnable hide = new Runnable() {
        @Override
        public void run() {
            textView1.setVisibility(View.GONE);
        }
    };
    

    2) 稍后调用 runnable:

    button1.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {
            // make textview visible for 1 second (1000 milliseconds)
            textView1.setVisibility(View.VISIBLE);      
            textView1.postDelayed(hide, 1000);
        }
    });
    

    (Handler 和 Runnable 不会阻塞 UI 线程。)

    【讨论】:

    • 我认为线条可能执行得太快了。有没有办法让它慢下来?当一切设置正确后,操作将需要更长的时间才能执行,但现在我只专注于 UI,我想放慢速度......
    • 你想让它闪烁吗?或者你想要什么类型的延迟?
    • 眨眼就可以了——我只需要确保用户有某种方式知道他们的点击被听到了! :)
    • 为什么不使用点击声而不是视觉闪烁?人们更善于回忆快速的声音而不是快速的图像。
    • 就像你说的,添加一个 wait(1000) 将是演示目的的理想选择,但它会阻塞 UI 线程并结束活动......
    【解决方案2】:

    这是处理程序的示例(我还没有编译它!)

    Handler handler = new Handler();
    
    button1.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {
            // make textview visible 
            textView1.setVisibility(View.VISIBLE);      
    
            // perform action
            System.out.println("perform action");
    
            // make textview disappear
            handler.postDelayed(new Runnable() {
              @Override
              public void run() {
                  textView1.setVisibility(View.GONE);
             }} , 2000);
        }
    });
    

    【讨论】:

    • 我认为这与 Sam 的答案相同——而且很棒!我会赞成它,但我还没有足够的声誉。不过谢谢!
    • 我会投赞成票。但是创建一个新的 Handler 并不是必须的,每个 View 都已经有一个 Handler 并且可以直接访问 post()postDelayed()
    【解决方案3】:

    使用动画

    public class MainActivity extends Activity {
         TextView txt;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Button b = (Button) findViewById(R.id.btn_animation);
    
            txt = (TextView) findViewById(R.id.textviewtest);
    
            b.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(final View v) {
                    txt.clearAnimation();
    
                    Animation fadeIn = new AlphaAnimation(0, 1);
                    fadeIn.setInterpolator(new DecelerateInterpolator()); //add this
                    fadeIn.setDuration(1000);
    
                    Animation fadeOut = new AlphaAnimation(1, 0);
                    fadeOut.setInterpolator(new AccelerateInterpolator()); //and this
                    fadeOut.setStartOffset(1000);
                    fadeOut.setDuration(1000);
    
                    AnimationSet animation = new AnimationSet(false); //change to false
                    animation.addAnimation(fadeIn);
                    animation.addAnimation(fadeOut);
    
                    animation.setAnimationListener( new AnimationListener() {
    
                        @Override
                        public void onAnimationEnd(Animation animation) {
                            // TODO Auto-generated method stub
                            txt.setVisibility(View.GONE);
                        }
    
                        @Override
                        public void onAnimationRepeat(Animation animation) {
                            // TODO Auto-generated method stub
    
                        }
    
                        @Override
                        public void onAnimationStart(Animation animation) {
                            // TODO Auto-generated method stub
                            txt.setVisibility(View.VISIBLE);
                        }
    
                    });
                    txt.setAnimation(animation);
                }
            });
        }
    

    activity_main.xml:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    
    <Button
        android:id="@+id/btn_animation"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Animation" />
    
    
    <TextView
        android:id="@+id/textviewtest"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:text="HelloWorld" />
    

    【讨论】:

    • 我不熟悉动画。我会使用它而不是 textView 吗?
    • 一个动画可以动画你的控件。您可以平移、旋转、调整大小和更改控件的 alpha。它更平滑。试试我上面做的例子。 :)
    【解决方案4】:

    您应该使用处理程序来运行将可见性设置为 GONE 的代码。也许Running a task at a specific time using postDelayed 可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 2014-12-14
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      相关资源
      最近更新 更多