Android 来自内线程的getVisibility()

Android 来自内线程的getVisibility(),android,android-view,visibility,Android,Android View,Visibility,在我的测试代码应用程序中,我在设置带有getVisibility的if语句时遇到问题 基本上,应用程序应该显示(从消失到可见)1个文本视图tv1,然后显示1个线性布局LL1,其中有2个按钮btn1和btn2。当按下其中一个按钮时,LL1应消失(从可见变为消失),取而代之的是新的tv2或tv3应出现(从消失变为可见),具体取决于按下的按钮。tv4应该等到LL1消失后再出现。在外观之间设置1s间隔 一切正常,直到有一部分不工作。我也试过了 if (btn1.isPressed() || btn2.i

在我的测试代码应用程序中,我在设置带有getVisibility的if语句时遇到问题

基本上,应用程序应该显示(从消失到可见)1个文本视图tv1,然后显示1个线性布局LL1,其中有2个按钮btn1和btn2。当按下其中一个按钮时,LL1应消失(从可见变为消失),取而代之的是新的tv2或tv3应出现(从消失变为可见),具体取决于按下的按钮。tv4应该等到LL1消失后再出现。在外观之间设置1s间隔

一切正常,直到有一部分不工作。我也试过了

if (btn1.isPressed() || btn2.isPressed())

但它不起作用。我想问题在于我获取可见性的方式

我甚至尝试定义全局
布尔x=false
,然后在OnClickListener设置中
x=true
返回false

如何使IF语句有效

布局文件中的所有内容(tv1..tv4、btn1、btn2、LL1)都是预定义的,并且初始设置为“消失”。 这是我的活动>

 @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.test_layout);
            Thread mainThread = new Thread(
                    new Runnable() {
                        @Override
                        public void run() {
                             startApp();
                        }
                    }
            );
            mainThread.start();
        }

public void startApp() {
        Button btn1 = (Button) findViewById(R.id.btn1);
        Button btn2 = (Button) findViewById(R.id.btn2);
        TextView tv1 = (TextView) findViewById(R.id.line1);
        TextView tv2 = (TextView) findViewById(R.id.line2);
        TextView tv3 = (TextView) findViewById(R.id.line3);
        TextView tv4 = (TextView) findViewById(R.id.line4);
        LinearLayout LL1 = (LinearLayout) findViewById(R.id.LL1);

        show_line(tv1, 1000);
        btnLL(LL1, btn1, btn2, tv2, tv3);

        //THIS IS THE PROBLEM IT ALWAYS RETURNS TRUE
        if (LL1.getVisibility()==View.GONE) show_line(tv4, 1000);
}

public void show_line (final TextView tv, int duration) {
        try {
            Thread.sleep(duration);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        tv.getHandler().post(new Runnable() {
            public void run() {
                tv.setVisibility(View.VISIBLE);
            }
        });
        /*tv.setVisibility(View.VISIBLE); CANT USE THIS BECAUSE IM NOT IN UI THREAD*/
}

public void btnLL (final LinearLayout LL, Button btnLeft, Button btnRight, final TextView tvLeft, final TextView tvRight) {

        //LL.setVisibility(View.VISIBLE); AGAIN NOT IN UI THREAD
        LL.getHandler().post(new Runnable() {
            public void run() {
                LL.setVisibility(View.VISIBLE);
            }
        });

        btnLeft.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LL.getHandler().post(new Runnable() {
                    public void run() {
                        LL.setVisibility(View.GONE);
                    }
                });
                tvLeft.getHandler().post(new Runnable() {
                    public void run() {
                        tvLeft.setVisibility(View.VISIBLE);
                    }
                });
            }
        });

        btnRight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LL.getHandler().post(new Runnable() {
                    public void run() {
                        LL.setVisibility(View.GONE);
                    }
                });
                tvRight.getHandler().post(new Runnable() {
                    public void run() {
                        tvRight.setVisibility(View.VISIBLE);
                    }
                });

            }
        });
}
很可能是因为它尚未渲染,因此尚未可见

您将需要像这样放置该签入:

    LL1.getHandler().post(new Runnable() {
        public void run() {
            if (LL1.getVisibility()==View.GONE) show_line(tv4, 1000);
        }
    });
在检查
getVisibility()
之前,将等待LL1呈现/可见


注意:正如GVillani82所说,您不必要地使用线程和post。您实际上不需要
Thread mainThread=new Thread()
(以及那些
view.getHandler().post()
),只有一些
view.post()
,就像我用我的“原语”写评论一样解决方案,我意识到了问题,测试并确认:)为什么如果不起作用

执行步骤:
1)
show\u line()
从GONE变为VISIBLE
2)
btnl()
从GONE变为VISIBLE,并用其
onClick()设置两个按钮
3) 这是重要的部分
用户应该在这里与应用程序交互,并做出选择,以便onClick可以执行,然后4)IF语句应该执行。

实际发生的情况是,如果在用户交互之前执行IF语句,那么LL1仍然可见,因此
IF(LL1.getVisible()==View.GONE)
返回false,当用户按下按钮,LL1切换到GONE时,IF已经执行,不再检查。

为什么要使用thread和post()?你可以删除所有内容,因为所有操作都应该在UI线程中。如果你想延迟从“消失”到“可见”的转换,请使用动画1)我对所有这些android内容都是新手:)2)我听说你应该使用自己的线程3)在这种情况下如何使用动画?4)我在实际应用程序中发布的内容会更多5)在不使用线程的情况下,如何使用睡眠?6)我仍然想找出这段代码的问题7)也许更好的选择是同步方法!?(同步/等待/通知)好的,我用我的“原语”解决了这个问题解决方案,但如果有人知道如何修复此代码,以及为什么此if不起作用,请发布您的答案,这样我就可以填补我的知识空白:)无论如何,在我尝试使用同步解决此问题之前,我声明了一个全局
布尔值x=false;
然后在
onClick
中,我在最后添加了
x=true;
而不是如果我使用
而(!x){}
一个空循环,它将等待
btnLL()
方法的操作x=false;
它按照我想要的方式工作。这仍然不起作用。IF语句显然返回false。如果我在UI线程中这样做,android studio会在我运行AVD时告诉我,UI线程中有太多内容,这段代码只是我需要的一小部分
    //THIS IS THE PROBLEM IT ALWAYS RETURNS TRUE
    if (LL1.getVisibility()==View.GONE) show_line(tv4, 1000);
    LL1.getHandler().post(new Runnable() {
        public void run() {
            if (LL1.getVisibility()==View.GONE) show_line(tv4, 1000);
        }
    });