32

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

    }

簡単に言えば、問題はこれです-この黒い画面の根本的な原因は本当に何ですか。これはスプラッシュアクティビティからですか、それともアプリケーションクラスからですか。そして、どうすればそれを解決し、これを示すフォームを回避できますか?

4

8 に答える 8

69

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

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"
         >
....

ここに黒い画面がある理由を読んでくださいアプリの起動時に、Androidはユーザーアクションへの即時応答として(アクティビティテーマに基づいて)シンプルなプレビューウィンドウを表示します。 次に、プレビューウィンドウは、完全に読み込まれると、実際のUIとクロスフェードします。 スムーズな視覚的移行を確実にするために、アクティビティテーマは完全なUIと可能な限り一致する必要があります。 次の画像は、適切に処理されない場合にエクスペリエンスがどのように不快になる可能性があるかを示しています。

于 2013-01-13T19:28:10.427 に答える
51

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

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/

于 2013-11-07T02:12:15.950 に答える
9

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

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

于 2013-11-25T07:58:28.353 に答える
2

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

このように、ドローアブルフォルダに新しいファイルxml(splash_bg.xml)ファイルを追加します。

<?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
于 2016-08-16T10:25:30.010 に答える
1

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

于 2013-01-13T19:21:56.753 に答える
1

この問題を回避するためのより良い解決策は、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メソッド内でこれを実装します。

            @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"));
        }
于 2013-01-13T19:38:31.337 に答える
0

ここにいくつかの考えの糧があります。アプリケーションにかなりの初期化遅延がまったくないかもしれません。実際、インスタント実行サービスを待っている可能性があります。

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

于 2017-05-02T14:23:39.973 に答える
0

これは、アクティビティをスプラッシュ画面として使用する場合にのみ発生します。アプリがAPIの呼び出しなどのバックグラウンド操作を行わない場合は、標準のスプラッシュ画面に@maulikparmarメソッドを使用します(Google推奨の方法)。しかし、アクティビティメソッドの場合、スプラッシュ画面アクティビティに注釈を書き込んだだけで、これは非常にうまく機能しました

@SuppressLint("CustomSplashScreen")
public class SplashScreen extends AppCompatActivity {}

また、スプラッシュ画面アクティビティのテーマ(style.xml)でandroid:windowDisablePreview=trueを実行します。

       <item name="android:windowDisablePreview">true</item>

于 2021-12-29T06:21:16.620 に答える