2012-09-13 37 views
7

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?

+0

Đ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? –

+0

có thể trùng lặp http://stackoverflow.com/questions/8642730/splash-screen-in-android-application –

+0

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

Trả lời

16

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; 
      } 
     } 
    }; 
} 
+0

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

1

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(); 
      } 
     }); 
    } 
}; 
3

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); 
    }  
} 
1

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.

0

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();  
    } 
//... 
0

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> 
+1

Đ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

Các vấn đề liên quan