【问题标题】:Android - Hide button during an onClick actionAndroid - 在 onClick 操作期间隐藏按钮
【发布时间】:2016-12-04 16:52:36
【问题描述】:

我需要在这样的 onClick 操作期间隐藏一个按钮:

    public void onClick(View view) {
    switch (view.getId()){
        case R.id.button1:

            Button button2 = (Button) findViewById(R.id.button2);
            button2.setVisibility(View.GONE);

            //Some methods
            //...

            button2.setVisibility(View.VISIBLE);

            break;
    }

但可见性仅在 onClick 之后发生变化,我该怎么做才能隐藏按钮 onClick 期间?

谢谢

【问题讨论】:

  • 如果您想在用户单击另一个视图时隐藏按钮/视图,那么您必须实现 onTouchListener 而不是 onClickListener
  • 我想在执行“某些方法”时隐藏按钮。

标签: android android-layout onclick visibility


【解决方案1】:

你可以尝试如下:

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch(v.getId()){
    case R.id.button1: {
        if(event.getAction() == MotionEvent.ACTION_DOWN){

            Button button2 = (Button) findViewById(R.id.button2);
            button2.setVisibility(View.GONE);

            return true;
        } else if(event.getAction() == MotionEvent.ACTION_UP) {

            // some methods

            Button button2 = (Button) findViewById(R.id.button2);
            button2.setVisibility(View.VISIBLE);

            return true;
        }
    return false;
    }
}

【讨论】:

    【解决方案2】:

    当然,因为你在同一个线程中执行所有操作,你可能会注意到可见性的变化,试试这个:

    public void onClick(View view) {
    switch (view.getId()){
        case R.id.button1:
    
            final button2 = (Button) findViewById(R.id.button2);
            button2.setVisibility(View.GONE);
    
            setVisibility(GONE);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //your work
    
                    runOnUiThread(new Runnable() { //resetting the visibility of the button
                        @Override
                        public void run() {
                            //manipulating UI components from outside of the UI Thread require a call to runOnUiThread
                            button2.setVisibility(VISIBLE);
                        }
                    });
                }
            }).start();
    
            break;
    }
    }
    

    【讨论】:

    • 行得通!另一个问题,总共有 3 个线程,一个用于将可见性设置为 GONE,另一个用于完成我的工作,最后一个用于再次设置可见性。是否可以在 2 个线程中执行相同的操作?
    • 实际上只有 2 个线程,UI 线程和您工作的第二个线程,runOnUiThread 不会创建新线程,而只是将其 run 方法中的代码发布到用户界面线程。来自关于runOnUiThread 方法的文档:在 UI 线程上运行指定的操作。如果当前线程是 UI 线程,则立即执行该操作。如果当前线程不是 UI 线程,则将 action 发布到 UI 线程的事件队列中。
    猜你喜欢
    • 2016-09-29
    • 2016-07-27
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多