我设计了一个带按钮的闪屏。 Java代码如下。 splash的布局包含一些带动画的文本和名为skipped splash screen的按钮。当用户按下按钮时,启动画面必须立即停止并打开下一个活动。但是当我打开启动画面并按下跳过按钮时,下一个活动会打开,但是在启动启动画面的持续时间结束后,活动将再次打开。如何在用户按下跳过按钮时停止启动画面?
var User = require('./app/models/user');
router.route('/users')
// create a user (accessed at POST http://localhost:8080/api/users)
.post(function(req, res) {
var user = new User(); //Not adding the req.body in the constructor
user._id = mongoose.Type.ObjectId(); //<-------THIS IS THE SOLUTION
//rest of attributes
// save the user and check for errors
user.save(function(err) {
if (err){
return res.send(err);
}
res.json({ message: 'User created!' });
});
})
// get all the users (accessed at GET http://localhost:8080/api/users)
.get(function(req, res) {
User.find(function(err, users) {
if (err)
res.send(err);
res.json(users);
});
});
答案 0 :(得分:2)
假设您希望将第一个活动保留在后台,但是您不希望线程在完成休眠后立即重新打开第二个活动。
为了实现这一点,您可以使“线程”成为自定义Thread
类的全局变量。您可以将其定义为活动的内部类:
MyThread thread;
和类定义:
private class MyThread extends Thread
{
public boolean bRun = true;
@Override
public void run()
{
try
{
sleep(3200);
if (bRun)
{
startActivity(new Intent(getApplicationContext(), Activity2.class));
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
在onCreate()
中,您可以写
thread = new MyThread();
thread.start();
然后你可以改变你的“onClick”方法:
public void round1(View v){
if (thread != null && thread.isAlive())
{
thread.bRun = false;
}
Intent i = new Intent(Qz1.this, Qone.class);
startActivity(i);
}
如果线程已经通过单击按钮启动,这将使线程无法启动第二个活动。
答案 1 :(得分:1)
将异步任务用于等待/休眠方案(例如启动屏幕)的最佳做法,但要求可能不同。
无论如何,这是我调用启动画面的方式:
首先创建AsyncTask
。
private class SplashTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
finish();
Intent intent = new Intent(SplashActivity.this,
MainActivity.class);
startActivity(intent);
}
}
}
然后在任意位置调用:按钮单击,开始或创建:
new SplashTask().execute();
答案 2 :(得分:1)
不应该使用sleep(2000)
使用animationlistener(http://developer.android.com/reference/android/view/animation/Animation.AnimationListener.html)
当触发onAnimationEnd时,调用startActivity。
答案 3 :(得分:1)
我认为这里的最佳做法是使用Handler。
你可以这样做:
public class Test extends AppCompatActivity{
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Settign the splashscreen with the button i suppose
setContentView(R.id.splashcreen);
}
@Override
protected void onStart() {
super.onStart();
handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
startNextActivity();
}
}, 2000);
}
public void startNextActivity(){
startActivity(new Intent(getApplicationContext(), Qone.class));
}
public void skipSplashScreen(){
if (handler != null)
handler.removeCallbacksAndMessages(null);
startNextActivity();
}
@Override
protected void onStop() {
super.onStop();
// clear handler on stop
if (handler != null)
handler.removeCallbacksAndMessages(null);
}
}
当用户按下按钮并且处理程序将停止以便计时器停止并且您通过调用方法startNextActivity()手动转到下一个活动时,CAll skipSplashScreen()。
答案 4 :(得分:0)
在启动活动中尝试此操作
Button button = (Button)findViewById(R.id.buttonLayout);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(this,TargetActivity.class));
finish();
}
});