web-dev-qa-db-ja.com

スプラッシュ画面の前に黒い画面がandroid

アプリがインターネットから情報をダウンロードするなどの長いプロセスを実行すると、アプリを読み込む前にスプラッシュ画面が表示され、アプリが完全に読み込まれるとメインページが表示されることがわかっています。スプラッシュスクリーンアクティビティでは、アプリを読み込む前に黒い画面が表示されないように、スレッドで長いプロセスを読み込む必要があります。私はそれらをすべてやりました。アプリを表示する前に黒い画面も表示されます。これは、スプラッシュスクリーンアクティビティのonCreateメソッドです。

    protected override void OnCreate (Bundle bundle)
    {
        try {
            base.OnCreate (bundle);
            //_dt = DateTime.Now.AddSeconds (_splashTime);
            SetContentView (Resource.Layout.Splash );
            FirstLoadPB= FindViewById <ProgressBar >(Resource .Id.FirstLoadPB );
            FirstLoadingInfo= FindViewById <TextView >(Resource .Id.FirstLoadInfo );
            LoadApplication ();

        } catch (System.Exception ex) {

            Common.HandleException (ex);
        }
    }

これはLoadApplicationメソッドのコードです:

public void LoadApplication()
    {
        new System.Threading.Thread (new ThreadStart (() =>
                                                      {
        //Some Codes to load applications- Downloading from web and accessing the storage(Because was many codes - about 100 line- i was clear them.

        }
        )
                                     ).Start ();
    }

黒い画面が表示される理由と、これから回避する方法を理解できません。アプリケーションクラスのoncreateでストレージにアクセスするコードがあります。問題の根本原因はそこにあるのかもしれません。そこで私はそのコードを共有しました:

public override void OnCreate ()
    {
        try {
            base.OnCreate ();
            _typeOfShow = new MapViewType ();
            ListingTypes = new Dictionary<int,ListingTypeItem> ();

            OfflineMode =false;
            PropertyShowWasShown = false;
            MeasutingUnitsChanged =false;
            if(RplXmlSettings .Instance .getVal (AppConstants .XmlSettingShowOnCurrentLocationKey  )== "True")
                typeOfShow .ShowOnCurrentLocation =true ;
            else
                typeOfShow .ShowOnCurrentLocation =false;
            //StorageClass .ctx = ApplicationContext ;
            FillDashboardOnResume =false;
            //initlize image loader 
            ImageLoader = Com.Nostra13.Universalimageloader.Core.ImageLoader.Instance;
            Options = new DisplayImageOptions.Builder ()
                .ShowImageForEmptyUri (Resource.Drawable.ic_tab_map)
                    .CacheOnDisc ()
                    .CacheInMemory ()
                    .ImageScaleType (ImageScaleType.InSampleInt)
                    .BitmapConfig (Bitmap.Config.Rgb565)
                    .Displayer (new FadeInBitmapDisplayer (300))
                    .Build ();
            ImageLoaderConfiguration config;

            ImageLoaderConfiguration .Builder builder =new ImageLoaderConfiguration
                .Builder (ApplicationContext).ThreadPoolSize (3);

            if(RplXmlSettings .Instance .getVal (AppConstants .XmlSettingMemoryCacheKey )== "True")
                builder .ThreadPriority (4).MemoryCacheSize (1500000) ;// 1.5 Mb

            builder .
                DenyCacheImageMultipleSizesInMemory ().
                    DiscCacheFileNameGenerator (new Md5FileNameGenerator ()).
                    MemoryCache (new WeakMemoryCache()).
                    DiscCacheSize (15000000);
            config = builder .Build ();
            ImageLoader.Init (config);

        } catch (Exception ex) {
            Common .HandleException (ex);
        }

    }

OK、長い話です。今、質問はこれです。本当にこの黒い画面の根本的な原因は何ですか。これは、スプラッシュアクティビティまたはアプリケーションクラスからのものですか。そして、どのようにそれを解決し、これを示す形を避けることができますか?

28

マニフェストファイルのアプリケーションタグに使用している背景のテーマを追加して、黒い画面が描画されないようにします。

theme.xml

<resources>
<!-- Base application theme is the default theme. -->
<style name="Theme" parent="Android:style/Theme" />

<style name="Theme.MyAppTheme" parent="Theme">
    <item name="Android:windowNoTitle">true</item>
    <item name="Android:windowContentOverlay">@null</item>
    <item name="Android:windowBackground">@drawable/my_app_background</item>

</style>
</resources>

AndroidManifest.xml

....
<application
        Android:name="@string/app_name"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/Theme.MyAppTheme"
         >
....

ここに黒い画面がある理由を読んでください On app launch, Android displays a simple preview window (based on your activity theme) as an immediate response to the user action. Then the preview window crossfades with your actual UI, once that has fully loaded. To ensure a smooth visual transition, your activity theme should match your full UI as closely as possible. The below image shows how the experience can be jarring if not handled properly.

64
TouchBoarder

表示されるこの初期画面は、「プレビュー」画面と呼ばれます。これをテーマで宣言することにより、これを完全に無効にできます。

Android:windowDisablePreview

<style name="Theme.MyTheme" parent="Android:style/Theme.Holo">
    <!-- This disables the black preview screen -->
    <item name="Android:windowDisablePreview">true</item>
</style>

この画面の処理方法の説明はこちらに掲載されています: http://cyrilmottier.com/2013/01/23/Android-app-launching-made-gorgeous/

48
mdupls

AndroidManifest.xmlのこの行をランチャーアクティビティに追加します。

Android:theme="@Android:style/Theme.Translucent.NoTitleBar.Fullscreen

8
Vinutha YS

このバグは、画像をブラシ(色)に変換することで解決できます。

次のように、新しいファイルxml(splash_bg.xml)ファイルをdrawableフォルダーに追加します。

<?xml version="1.0" encoding="utf-8" ?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
   <item>
      <color Android:color="@color/splash_bg_color"/>
   </item>
   <item>
        <bitmap
            Android:src="@drawable/splash_screen"
            Android:tileMode="disabled"
            Android:gravity="center"/>
   </item>
</layer-list>

次に、新しいスタイルを追加して、splash_bg.xmlを背景色として適用します。

<style name="Theme.SplashBg" parent="Android:Theme">
    <item name="Android:windowBackground">@drawable/splash_bg</item>
    <item name="Android:windowNoTitle">true</item>
    <item name="Android:windowContentOverlay">@null</item>
</style>

この新しいスタイルをメインのランチャーアクティビティまたはスプラッシュスクリーンに適用します。

[Activity(Label = "label", MainLauncher = true, Theme = "@style/Theme.SplashBg")]
public class SplashScreenActivity : Activity
2
Maulik Parmar

この問題を回避するためのより良い解決策は、AsyncTaskを使用することです。これは、ListActivityの1つで使用するサンプルコードです。

 private class YoutubeTask extends AsyncTask<URL, Integer, String> {
     protected void onPreExecute() {
            super.onPreExecute();
            mLoadingProgress.startAnimation(mDisappear);
        mLoadingProgress.setVisibility(View.GONE);
            showDialogProgress();
    }

     protected String doInBackground(URL... url) {

         youtubeData = VersionParser.readFromUrl(url[0]);;

        try {

            JSONObject jsono = new JSONObject(youtubeData);
            JSONObject feed = jsono.getJSONObject("feed");
            JSONArray entry = feed.getJSONArray("entry");

            for(int i = 0 ; i < entry.length() ; i++ ){

                JSONObject item = entry.getJSONObject(i);

                JSONArray AUTHOR = item.getJSONArray(TAG_AUTHOR);
                JSONObject Author = AUTHOR.getJSONObject(0);
                JSONObject author = Author.getJSONObject("name");
                String author_name = author.getString(TAG_TITRE);

                JSONObject Statistics = item.getJSONObject("yt$statistics");
                String Views = Statistics.getString(TAG_VIEWS);

                JSONObject Media = item.getJSONObject("media$group");

                JSONObject MediaTitle = Media.getJSONObject("media$title");
                String title = MediaTitle.getString(TAG_TITRE);

                JSONObject DURATION = Media.getJSONObject("yt$duration");
                String duration = DURATION.getString(TAG_DURATION);

                JSONArray Thumbinail = Media.getJSONArray("media$thumbnail");
                JSONObject IMAGE = Thumbinail.getJSONObject(0);
                String image = IMAGE.getString(TAG_CONTENT);
                String id = image.substring(22,33);

                 map = new HashMap<String, String>();

                    map.put(TAG_TITRE , title ); 
                    map.put(TAG_ID , id );
                    map.put(TAG_DURATION , duration );
                    map.put(TAG_IMAGE , image);
                    map.put(TAG_VIEWS , Views );
                    map.put(TAG_AUTHOR , author_name);

                   CURRENCY.add(map);
                }


        } catch (JSONException e) {

            e.printStackTrace();
        }
            return null;
        }


     @Override
        protected void onPostExecute(String result) { 

             dismisDialogProgress(); 
             mListView.setVisibility(View.VISIBLE);
            mListView.startAnimation(mAppear);
            mAdapter = new MAdapter(youtubeSearch.this , CURRENCY);
            mListView.setSelector(R.drawable.home_bg);
            mListView.setAdapter(mAdapter);

             } 
    }

onCreate Methode内でこれを実装します。

            @Override

    public void onCreate(Bundle savedInstanceState) {

        if (Build.VERSION.SDK_INT < 11)
        setTheme(Android.R.style.Theme_Black_NoTitleBar);
    }
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


    new YoutubeTask().execute(new URL("https://gdata.youtube.com/feeds/api/videos?q=Adele&max-results=15&v=2&alt=json"));
        }
1
Nawfal Ahmad

OnCreateで「重いコード」を呼び出すと、読み込みが完了するまで画面が黒く表示されます。 AsyncTaskの使用を検討し、onCreateハンドルをsetContentViewなどにし、AsyncTaskハンドルを「重いコード」にすることができます。

1
Magakahn

考えてみてください。多分あなたはしないでくださいアプリケーションでかなりの初期化遅延があります;実際には、インスタントランサービスの待機.

私が経験したことから、この症状は、アプリケーションが初期化中に長い黒い画面を表示することですが、デバッグすると、Application/Activity 's onCreateメソッドはまだ表示されていますが、まだ呼び出されていません

0
Mapsy