主な問題は、2〜3秒後にスプラッシュスクリーンが表示されることです。スプラッシュ画面の前に、望まない空白のレイアウトが表示されます。それ以外の場合は正常に動作します。スプラッシュページの前に表示される空白のレイアウトを削除するだけです。
主な活動:
public class MainActivity extends Activity {
private static String TAG = MainActivity.class.getName();
private static long SLEEP_TIME = 5; // Sleep for some time
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE); // Removes title bar
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // Removes notification bar
setContentView(R.layout.activity_main);
// Start timer and launch main activity
IntentLauncher launcher = new IntentLauncher();
launcher.start();
}
private class IntentLauncher extends Thread {
@Override
/**
* Sleep for some time and than start new activity.
*/
public void run() {
try {
// Sleeping
Thread.sleep(SLEEP_TIME*1000);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
// Start main activity
Intent intent = new Intent(MainActivity.this, Login.class);
MainActivity.this.startActivity(intent);
MainActivity.this.finish();
}
}
}
メインレイアウト
<RelativeLayout 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"
Android:paddingBottom="@dimen/activity_vertical_margin"
Android:paddingLeft="@dimen/activity_horizontal_margin"
Android:paddingRight="@dimen/activity_horizontal_margin"
Android:paddingTop="@dimen/activity_vertical_margin"
Android:background="@drawable/splash"
tools:context=".MainActivity" >
</RelativeLayout>
一般的に、スプラッシュスクリーンはアプリにはお勧めしませんが、本当に必要な場合はお勧めします。
Androidは、設定したテーマに基づいてアクティビティレイアウトを読み込む前に、空のレイアウトを読み込みます。解決策は、スプラッシュアクティビティのテーマを透明なものに設定することです。
res/values/styles.xml
に透明なテーマを作成します
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.Transparent" parent="Android:Theme">
<item name="Android:windowIsTranslucent">true</item>
<item name="Android:windowBackground">@Android:color/transparent</item>
<item name="Android:windowContentOverlay">@null</item>
<item name="Android:windowNoTitle">true</item>
<item name="Android:windowIsFloating">true</item>
<item name="Android:backgroundDimEnabled">false</item>
</style>
</resources>
次に、マニフェストにテーマを設定します
<activity Android:name=".SplashActivity" Android:theme="@style/Theme.Transparent">
...
</activity>
開始アクティビティにはテーマの背景を使用することをお勧めしますが、メインアクティビティを起動する前に空白の画面を表示したくない場合は、次のようにアクティビティを定義できます。
追加 Android:windowDisablePreview
にAppTheme res/values/styles.xmlで:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="Android:Theme">
<item name="Android:windowDisablePreview">true</item>
</style>
</resources>
次に、マニフェストでアクティビティテーマを設定します。
<activity Android:name=".MainActivity" Android:theme="@style/AppTheme">
...
</activity>
追伸:設定Android:windowDisablePreview
はアクティビティの背景に影響しないため、心配する必要はありません。
AndroidManifest.xmlファイルで開始アクティビティに透明なテーマを指定するだけです。
<activity
Android:name="first Activity Name"
Android:theme="@Android:style/Theme.Translucent.NoTitleBar" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
ここで直面している問題は「コールドスタート」と呼ばれ、主にApplication.onCreate
メソッド。通常、いくつかの初期化が行われ、希望よりも時間がかかる場合があります。こちらの公式ドキュメントをご覧ください: https://developer.Android.com/topic/performance/launch-time.html
これが当てはまる場合、テーマを半透明に設定するか、他の人が示唆したようにプレビューを無効にすると、問題が明らかに解決するだけです。実際には、アプリを起動しようとしますが、アプリをタップしたという事実に関するフィードバックを受け取らないためですアイコン。アプリは遅延から始まりますが、これは望ましいUXではありません。
空白、黒または白の画面、それは本当にAndroid:windowBackground
属性がメインアクティビティテーマで指定されています。おそらくあなたがしている初期化のいくつかをApplication.onCreate
方法、この投稿で提案されているように、ロゴでプレビューウィンドウにブランドを付けることです。
https://plus.google.com/+AndroidDevelopers/posts/Z1Wwainpjhd
スプラッシュ画面でロゴ画像をアニメーション化するか、または以下に説明するようにメインアクティビティコンテンツにスムーズに移行できるようにプレビューウィンドウを設計することにより、さらに進んでユーザーエクスペリエンスを改善できます。
http://saulmm.github.io/avoding-Android-cold-starts
同じ質問がここで正しく回答されています: https://stackoverflow.com/a/40482549/70942 このブログ投稿で説明されています: https://www.bignerdranch.com/blog/ splash-screens-the-right-way /
本当に!以下のリンクは私のために働く!!!!
https://cyrilmottier.com/2013/01/23/Android-app-launching-made-gorgeous/
スプラッシュスクリーン用にstyle.xmlに個別のスタイルを記述して、両方のスクリーンを相互に関連付けられるようにします。
ここでスタイル:
<style name="AppTheme.Splash" parent="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="Android:windowBackground">@drawable/splash_final</item>
</style>
Android機能。空白画面の背景色を変更できます。スタイルを使用します。
<resources>
<style name="Theme" parent="Android:style/Theme" />
<style name="Theme.MainTheme" parent="Theme">
<item name="Android:windowNoTitle">true</item>
<item name="Android:windowContentOverlay">@null</item>
<item name="Android:windowBackground">@drawable/background_drawable</item>
</style>
</resources>
それをマニフェストで使用します:
<application
Android:name="@string/app_name"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/Theme.MainTheme"
>
これをスタイルファイルに追加します
<item name="Android:windowDisablePreview">true</item>
Android Studio。のビルドツールを更新するだけで修正しました。
これは、上に投稿されたいくつかの答えに似ていると思います。スプラッシュスクリーンを適切な方法で作成する方法について、次のBig Nerd Ranchガイドをお勧めします。以下に進む代わりに、実際にそこに行って読んでください:)。 https://www.bignerdranch.com/blog/splash-screens-the-right-way/
しかし、要するに、アプリの起動時に最初のスプラッシュアクティビティを起動することです。このアクティビティでは、XMLドロアブル(@drawable/background_splash
)。
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@color/gray"/>
<item>
<bitmap
Android:gravity="center"
Android:src="@mipmap/ic_launcher"/>
</item>
</layer-list>
次に、スプラッシュアクティビティのテーマを作成し、上で作成したドロアブルをウィンドウの背景として設定します。
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="Android:windowBackground">@drawable/background_splash</item>
</style>
そして、マニフェストで、スプラッシュアクティビティに上記のテーマを使用するように指示します。
<activity
Android:name=".SplashActivity"
Android:theme="@style/SplashTheme">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
最後に、スプラッシュアクティビティで、以下のようなthe onCreate
メソッドを実装します(アクティビティで必要なすべてのコード)。これにより、メインアクティビティが起動され、スプラッシュアクティビティが終了します。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
このスタイルを追加
<style name="Theme.Transparent" parent="AppTheme">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="Android:windowDisablePreview">true</item>
<item name="Android:windowContentOverlay">@null</item>
</style>
以下のコードのように、レイアウトから画像をロードするよりも、スプラッシュ画面に画像をロードする場合
<?xml version="1.0" encoding="utf-8"?>
<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"
Android:background="@color/color_white">
<ImageView
Android:id="@+id/ivSplash"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/SPLASH_IMAGE"
/>
</LinearLayout>
AppCompatActivityのサポート付き
<style name="SplashTheme" parent="AppTheme">
<item name="Android:windowBackground">@Android:color/transparent</item>
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="Android:windowFullscreen">true</item>
<item name="Android:windowIsTranslucent">true</item>
<item name="Android:windowContentOverlay">@null</item>
<item name="Android:backgroundDimEnabled">false</item>
<item name="Android:windowDisablePreview">true</item>
</style>
GL