来自内部线程的getVisibility()

时间:2017-01-09 21:25:45

标签: android android-view visibility

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

基本上,app应该显示(从GONE到VISIBLE)1 TextView tv1,然后显示1个LinearLayout LL1,里面有2个按钮btn1& BTN2。当按下任何一个时,LL1应该消失(从VISIBLE回到GONE)并且在它的位置,新的tv2或tv3应该出现(从GONE到VISIBLE),具体取决于按下哪个按钮。 tv4应该等到LL1为GONE,然后出现。在出现之间设置1s间隔。

一切运行正常,直到IF部分无效。我也试过

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

if (tv2.getVisibility()==View.VISIBLE || tv3.getVisibility()==View.VISIBLE)

但它没有用。我想问题是我访问getVisibility的方式。

我甚至尝试定义全局boolean x=false;,然后在OnClickListener设置x=true;,但然后if (x) {...返回false!

如何使声明工作!?

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

 @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);
                    }
                });

            }
        });
}

2 个答案:

答案 0 :(得分:0)

    //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);
        }
    });

在检查getVisibility()之前,会等待LL1呈现/可见。

注意:像GVillani82所说,你不必要地使用线程和帖子。您实际上并不需要Thread mainThread = new Thread()(以及那些view.getHandler().post()),只需要一些view.post()

答案 1 :(得分:0)

好吧,就像我用“原始”解决方案写评论一样,我意识到了问题,对其进行了测试并确认了:)为什么IF不起作用......

执行步骤:
1)show_line()从GONE变为VISIBLE
2)btnLL()从GONE变为VISIBLE并设置2个按钮及其onClick()
3)这是重要的部分 这是用户应该与app进行交互并做出选择的地方,以便onClick可以执行,然后4)IF语句应该执行 实际发生的是IF语句在用户交互之前执行,因此LL1仍然是可见的,因此if (LL1.getVisible()==View.GONE)返回false,当用户按下按钮并且LL1切换到GONE时,IF已经执行且不执行再检查一下。