我有一个似乎是一个简单的问题,但对于我的生活无法弄明白......
我有一个显示公司徽标的主要活动,基本上是一个启动画面。我想让它显示2秒左右,然后淡出到实际的应用程序主要活动。我试图使用sleep实现,但这样做会给我一个空白的屏幕标识活动。似乎在睡眠完成之后图像才会被加载。基本上应用程序启动,显示黑屏2秒,然后转换到我的应用程序。如果我点击后面,我会看到徽标。我在这做错了什么?这是我的徽标代码。 logo.xml有一个带有可绘制资源的ImageView:
public class Logo extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.logo);
// Intent to jump to the next activity
Intent intent= new Intent(this, NextActivity.class);
this.startActivity(intent);
SystemClock.sleep(2000);
}
}
答案 0 :(得分:8)
你正在阻止UI线程,这是一个很大的禁忌。在onCreate
方法返回之前,系统无法绘制屏幕。执行所需操作的常用方法是启动一个等待的单独线程,然后将Runnable发布到UI线程:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.logo);
final Handler handler = new Handler();
final Runnable doNextActivity = new Runnable() {
@Override
public void run() {
// Intent to jump to the next activity
Intent intent= new Intent(this, NextActivity.class);
startActivity(intent);
finish(); // so the splash activity goes away
}
};
new Thread() {
@Override
public void run() {
SystemClock.sleep(2000);
handler.post(doNextActivity);
}
}.start();
}
一种更简单的方式(正如Athmos在他的回答中所建议的那样)是让处理程序为你倒计时:
Handler mHandler;
Runnable mNextActivityCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.logo);
mHandler = new Handler();
mNextActivityCallback = new Runnable() {
@Override
public void run() {
// Intent to jump to the next activity
Intent intent= new Intent(this, NextActivity.class);
startActivity(intent);
finish(); // so the splash activity goes away
}
};
mHandler.postDelayed(mNextActivityCallback, 2000L);
}
这样做的好处是您可以取消继续下一个活动(例如,如果使用按下后退按钮,或者如果您在这2秒内检测到错误情况或某事):
@Override
protected void onPause() {
if (isFinishing()) {
mHandler.removeCallbacks(mNextActivityCallback);
}
}
答案 1 :(得分:0)
而不是在构造函数中使用sleep,这会使视图的构造延迟2秒,这就是为什么它只显示2秒后的图片,请尝试按照此处的建议
http://androidforums.com/40306-post4.html 另外对于后退按钮问题添加
android:noHistory="true"
到徽标活动的清单
答案 2 :(得分:0)
你试过这个......
// Intent to jump to the next activity
Intent intent= new Intent(this, NextActivity.class);
SystemClock.sleep(2000); //NOTE before the start of the next activity
this.startActivity(intent);
...在onResume();
据我所知,在调用onCreate()时,并不认为Activity是正确显示的。但onResume()总是被调用,据我所知,当时应该显示everthing。 如果您只想展示一次,请为它制作标志。 见:Activity lifecycle
但无论如何,你做错了什么;)使用Handler,Thread或类似的
其他解决方案:
Handler
来延迟。甚至使用
透明度,使花哨的淡出。看看ImageView setAlpha(...)
。Handler
代替sleep(...)
。恕我直言sleep(...)
可能导致'应用程序无响应'这段代码应该用于工作:
Handler mHandler = new Handler();
class MyTask implements Runnable{
public void run(){
//start next activity or fadeout ImageView or ...
}
}
现在调用onResume:
mHandler.postDelayed(new MyTask(), 100); //or any other Runnable
答案 3 :(得分:0)
你应该在新线程中使用sleep,因为它停止执行oncreate方法,你可以在设置setcontentview之后使用它