Tôi cần một màn hình giật gân cho ứng dụng của mình. Đã cố tạo một hoạt động có hình ảnh cho màn hình giật gân của tôi; và thử sử dụng vòng lặp và lớp Timer để giới thiệu thời gian trễ. Nhưng nó không hoạt động theo cách đó. Tôi làm sai; nếu có, đúng cách là gì?Cách tốt nhất để có màn hình giật gân trong ứng dụng Android?
Trả lời
Các giải pháp trên là tốt, nhưng nếu người dùng nhấn phím quay lại (và đóng ứng dụng của bạn) trước khi hết thời gian chờ. Ứng dụng có thể sẽ vẫn mở Hoạt động tiếp theo, không thực sự thân thiện với người dùng.
Đó là lý do tại sao tôi làm việc với Trình xử lý tùy chỉnh và xóa mọi thư đang chờ xử lý trong onDestroy().
public class SplashActivity extends Activity
{
private final static int MSG_CONTINUE = 1234;
private final static long DELAY = 2000;
@Override
protected void onCreate(Bundle args)
{
super.onCreate(args);
setContentView(R.layout.activity_splash);
mHandler.sendEmptyMessageDelayed(MSG_CONTINUE, DELAY);
}
@Override
protected void onDestroy()
{
mHandler.removeMessages(MSG_CONTINUE);
super.onDestroy();
}
private void _continue()
{
startActivity(new Intent(this, SomeOtherActivity.class));
finish();
}
private final Handler mHandler = new Handler()
{
public void handleMessage(android.os.Message msg)
{
switch(msg.what){
case MSG_CONTINUE:
_continue();
break;
}
}
};
}
Tôi nghĩ onPause là một tùy chọn tốt hơn cho cuộc gọi removeMessages(). Tôi đã thấy rằng onDestroy được gọi là quá muộn trong vòng đời và hoạt động tiếp theo xuất hiện sau khi nhấp lại. +1 mặc dù :-) – barry
Bạn chỉ có thể trì hoãn?
Thread delay = new Thread() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
runOnUiThread(new Runnable() {
@Override
public void run() {
startNextActivity();
}
});
}
};
Hãy thử điều này
public class SplashActivity extends Activity {
Handler handler;
private long timeDelay = 2000; //2 seconds
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.SplashLayout);
final Intent i = new Intent(this, Landing.class);
handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
startActivity(i);
finish();
}
}, timeDelay);
}
}
Hãy thử điều này,
protected int _splashTime = 15000;
private Handler handler;
private Runnable runnable;
private Context context;
@Override
public void onCreate(Bundle savedInstance)
{
super.onCreate(savedInstance);
setContentView(R.layout.splash);
final SplashScreen sPlashScreen = this;
handler = new Handler();
runnable = new Runnable() {
@Override
public void run() {
try {
handler.removeCallbacks(runnable);
handler.postDelayed(runnable, _splashTime);
}
finally {
finish();
//start a new activity
//mtdCheckLicense();
Intent main = new Intent();
main.setClass(sPlashScreen, YourMainActivity.class);
startActivity(main);
handler.removeCallbacks(runnable);
}
}
};
handler.postDelayed(runnable, 2000);
}
Nó sẽ giật gân trong một thời gian và khởi động các hoạt động chính. Trong đoạn mã này, màn hình giật gân chờ 2 giây và sau đó khởi chạy hoạt động chính.
Cách đơn giản nhất tôi làm cho mỗi dự án của tôi là trông như thế này:
public class SplashActivity extends Activity {
protected boolean active = true;
protected int splashTime = 1000;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash_screen);
Thread splashTread = new Thread() {
@Override
public void run() {
try {
int waited = 0;
while(active && (waited < splashTime)) {
sleep(100);
if(active) {
waited += 100;
}
}
} catch(InterruptedException e) {
// do nothing
} finally {
finish();
// Start your Activity here
}
}
};
splashTread.start();
}
//...
Với các giải pháp mô tả ở đây bạn đang lãng phí thời gian vì họ tạm dừng khởi cho 2-3seconds trước khi họ tiếp tục .
Tôi muốn thêm Splash Screen Layout
vào đầu số main_activity.xml
. Tôi phát hiện bắt đầu đầu tiên của ứng dụng bằng cách mở rộng Ứng dụng. Nếu nó bắt đầu đầu tiên, tôi thấy tôi Splash-Screen trong khi giao diện người dùng được xây dựng trong nền ... (Sử dụng đề nền nếu ProgressBar chậm!)
//Extend Application to save the value. You could also use getter/setter for this instead of Shared Preferences...
public class YourApplication extends Application {
public static final String YOUR_APP_STARTUP = "APP_FIRST_START";
@Override
public void onCreate() {
super.onCreate();
//set SharedPreference value to true
SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = mPreferences.edit();
editor.putBoolean(YOUR_APP_STARTUP, true);
editor.apply();
...
}
Kiểm tra cho điểm bắt đầu đầu tiên của bạn trong MainActivity
của bạn
public class YourMainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//hide actionbar and other menu which could overlay the splash screen
getActionBar().hide();
setContentView(R.layout.activity_main);
Boolean firstStart = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean(TVApplication.YOUR_APP_STARTUP, true);
if (firstStart) {
//First app start, show splash screen an hide it after 5000ms
final RelativeLayout mSplashScreen = (RelativeLayout) findViewById(R.id.splash_screen);
mSplashScreen.setVisibility(View.VISIBLE);
mSplashScreen.setAlpha(1.0f);
final FrameLayout mFrame = (FrameLayout) findViewById(R.id.frame_container);
mFrame.setAlpha(0.0f);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Animation fadeOutAnimation = AnimationUtils.loadAnimation(getApplicationContext(),
R.anim.fade_out_animation);
fadeOutAnimation.setDuration(500);
fadeOutAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
mFrame.setAlpha(1.0f);
getActionBar().show();
}
@Override
public void onAnimationEnd(Animation animation) {
mSplashScreen.setVisibility(View.GONE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
mSplashScreen.startAnimation(fadeOutAnimation);
}
}, 5000); //<-- time of Splash Screen shown
} else {
((RelativeLayout) findViewById(R.id.splash_screen)).setVisibility(View.GONE);
getActionBar().show();
}
Chèn SplashScreen ở trên trong tệp main.xml của bạn. Tôi thích RelativeLayout
cho điều đó. Trong ví dụ, SplashScreen được đặt trên một bố trí với Navitgation Drawer
, mà chúng ta thực sự yêu thích, không phải chúng ta?
//main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- The main content view -->
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- The navigation drawer list -->
<ListView
android:id="@+id/slider_list"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_gravity="start"
android:background="@color/tvtv_background"
android:choiceMode="singleChoice"
android:divider="@drawable/nav_bar_divider"
android:dividerHeight="1dp"
android:listSelector="@android:color/transparent" />
</android.support.v4.widget.DrawerLayout>
<RelativeLayout
android:id="@+id/splash_screen"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:background="@color/tvtv_white"
android:visibility="visible" >
<ImageView
android:id="@+id/splash_screen_logo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:paddingLeft="50dp"
android:paddingRight="50dp"
android:scaleType="fitCenter"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/splash_screen_text"
style="@style/TVTextBlueContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/splash_screen_logo"
android:layout_centerHorizontal="true"
android:padding="10dp"
android:text="Awesome splash shiat" />
<ProgressBar
android:id="@+id/splash_screen_loader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/splash_screen_text"
android:layout_centerHorizontal="true"
android:clickable="false"
android:indeterminate="true" />
</RelativeLayout>
</RelativeLayout>
Điều này có nghĩa là màn hình splash của bạn sẽ luôn ở trong hệ thống phân cấp chế độ xem của bạn, ngay cả khi bạn không sử dụng nó. Nếu bạn muốn sử dụng cách tiếp cận này, tốt hơn hãy sử dụng 'ViewStub' cho điều đó. http://developer.android.com/reference/android/view/ViewStub.html – Jelle
Điều gì đặc biệt không phù hợp với bộ hẹn giờ? Cách tiếp cận đó sẽ hoạt động. Bạn có thể dán mã của mình không? –
có thể trùng lặp http://stackoverflow.com/questions/8642730/splash-screen-in-android-application –
Bạn nên đăng câu trả lời nếu câu hỏi khác với câu hỏi khác hoặc xóa bài đăng nếu nó giống nhau. – Sababado