来自内部线程的 getVisibility()
getVisibility() from inner Thread
在我的测试代码应用程序中,我在设置带有 getVisibility 的 if 语句时遇到问题。
基本上,应用程序应该显示(从消失到可见)1 个 TextView tv1,然后显示 1 个 LinearLayout LL1,其中有 2 个按钮 btn1 和 btn2。当按下任一按钮时,LL1 应该消失(从 VISIBLE 回到 GONE),取而代之的是,新的 tv2 或 tv3 应该出现(从 GONE 到 VISIBLE),具体取决于按下的是哪个按钮。 tv4 应该等到 LL1 消失,然后出现。出现间隔设置为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) {...
returns false!?
如何使 IF 语句生效!?
布局文件中的所有内容(tv1..tv4、btn1、btn2、LL1)都是预定义的,并且初始设置为 GONE。
这是我的 activity>
@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);
}
});
}
});
}
//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);
}
});
这将等待 LL1 变为 rendered/visible,然后再检查 getVisibility()
。
注意:正如 GVillani82 所说,您不必要地使用线程和帖子。你真的不需要 Thread mainThread = new Thread()
(以及那些 view.getHandler().post()
),只需要一些 view.post()
.
好的,就像我用我的 "primitive" 解决方案写评论一样,我意识到了问题,测试并确认:) 为什么 IF 不起作用...
执行步骤:
1) show_line()
从 GONE 变为 VISIBLE
2) btnLL()
从 GONE 变为 VISIBLE 并使用它们的 onClick()
设置 2 个按钮
3) 这是重要的部分
这是用户应该与应用程序交互并做出选择以便 onClick 可以执行的地方,然后 4) IF 语句应该执行。
实际发生的是 IF 语句在用户交互之前执行,因此 LL1 仍然可见,因此 if (LL1.getVisible()==View.GONE)
返回 false,当用户按下按钮并且 LL1 切换到 GONE 时,IF 已经执行并且没有再检查一下。
在我的测试代码应用程序中,我在设置带有 getVisibility 的 if 语句时遇到问题。
基本上,应用程序应该显示(从消失到可见)1 个 TextView tv1,然后显示 1 个 LinearLayout LL1,其中有 2 个按钮 btn1 和 btn2。当按下任一按钮时,LL1 应该消失(从 VISIBLE 回到 GONE),取而代之的是,新的 tv2 或 tv3 应该出现(从 GONE 到 VISIBLE),具体取决于按下的是哪个按钮。 tv4 应该等到 LL1 消失,然后出现。出现间隔设置为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) {...
returns false!?
如何使 IF 语句生效!?
布局文件中的所有内容(tv1..tv4、btn1、btn2、LL1)都是预定义的,并且初始设置为 GONE。 这是我的 activity>
@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);
}
});
}
});
}
//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);
}
});
这将等待 LL1 变为 rendered/visible,然后再检查 getVisibility()
。
注意:正如 GVillani82 所说,您不必要地使用线程和帖子。你真的不需要 Thread mainThread = new Thread()
(以及那些 view.getHandler().post()
),只需要一些 view.post()
.
好的,就像我用我的 "primitive" 解决方案写评论一样,我意识到了问题,测试并确认:) 为什么 IF 不起作用...
执行步骤:
1) show_line()
从 GONE 变为 VISIBLE
2) btnLL()
从 GONE 变为 VISIBLE 并使用它们的 onClick()
设置 2 个按钮
3) 这是重要的部分
这是用户应该与应用程序交互并做出选择以便 onClick 可以执行的地方,然后 4) IF 语句应该执行。
实际发生的是 IF 语句在用户交互之前执行,因此 LL1 仍然可见,因此 if (LL1.getVisible()==View.GONE)
返回 false,当用户按下按钮并且 LL1 切换到 GONE 时,IF 已经执行并且没有再检查一下。