您好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操作中出现并消失?
感谢您的帮助!
答案 0 :(得分:5)
这些命令是背靠背执行的。因此从技术意义上说,它可能是可见的,但只有一两毫秒。您需要区分何时使视图可见以及何时隐藏它...
你说过你希望TextView在某种意义上“闪烁”,所以让我们使用Handler作为每个View的一部分来调用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线程。)
答案 1 :(得分: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);
}
});
答案 2 :(得分:1)
使用动画
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" />
答案 3 :(得分:0)
您应该使用处理程序来运行将Visibility设置为GONE的代码。也许Running a task at a specific time using postDelayed可能有帮助。