Pantalla en negro antes de que la pantalla Splash aparezca en android
Sabemos que cuando la aplicación de algún proceso largo como la descarga de información de Internet podría mostrar una pantalla de bienvenida antes de cargar la aplicación y cuando la aplicación se carga completamente se mostrará la página principal. En la actividad de pantalla de inicio debemos cargar procesos largos en subprocesos para evitar mostrar la pantalla en negro antes de cargar la aplicación. Yo había hecho todos ellos. Pero también la pantalla negra aparece antes de mostrar la aplicación. Este es mi método onCreate de la actividad de la pantalla de bienvenida:
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); } }
Y este es el código del método LoadApplication
:
- ¿Cómo hacer un intervalo de sombra de cadena en Android?
- FormsAppCompatActivity y MasterDetailPage: no hay barra de herramientas
- Simulaciones de desarrollo de Android de MonoDroid
- Xamarin.Forms MasterDetailPage con TabbedView - Tab Título que aparece al navegar a través del menú de hamburguesas
- Mono para Android - Arquitectura soportada - Drop x86?
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 (); }
No entiendo por qué aparece la pantalla negra y cómo debe evitar de esto ahora. Tengo algún código que el acceso al almacenamiento en oncreate de mi clase de aplicación. Tal vez la raíz de la cuestión sea desde allí. Así que he compartido su código:
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.Long short.Now historia la pregunta es esta – Realmente lo que es la causa de esta pantalla en negro. Es esto de la actividad de salpicaduras o de la clase de aplicación. ¿Y cómo podemos resolverlo y evitar la forma de mostrar esto?
- Descenso Xamarin.Android
- Añadir elevación / sombra en la barra de herramientas para dispositivos pre-lollipop
- ¿Por qué no puedo establecer la elevación en una vista que agrego mediante programación?
- Estilizar un texto de edición de Android para que parezca un selector de lista desplegable / spinner
- ¿Puedes ejecutar juegos XNA en Android?
- Clase de clase de aplicación personalizada en Mono para Android
- Android: EditText activa automáticamente el teclado, ¿cómo detenerlo?
- Cómo crear un DialogFragment personalizado al 100%
Agregue un tema con el fondo que está utilizando a su etiqueta de aplicación en el archivo de manifiesto para evitar que se dibuje la pantalla en negro.
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" > ....
Lea por qué hay una pantalla en negro aquí
Esta pantalla inicial que se ve se denomina pantalla "Vista previa". Puede desactivar esto completamente declarando esto en su tema:
android:windowDisablePreview <style name="Theme.MyTheme" parent="android:style/Theme.Holo"> <!-- This disables the black preview screen --> <item name="android:windowDisablePreview">true</item> </style>
Una explicación de cómo manejar esta pantalla se publica aquí: http://cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous/
Agregue esta línea en su AndroidManifest.xml
a la Actividad del Lanzador:
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen
Si llama a algún "código pesado" en onCreate la pantalla aparecerá en negro hasta que se complete la carga. Usted podría considerar el uso de AsyncTask y hacer que el onCreate manejar setContentView etc, y hacer que el AsyncTask manejar "el código pesado".
La mejor solución para evitar este problema es usar AsyncTask, aquí hay un código de ejemplo que uso en uno de mis ListActivity:
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); } }
Y dentro del método onCreate implementar esto:
@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")); }
Puede resolver este error convirtiendo la imagen como un pincel (color).
Agregue un nuevo archivo xml (splash_bg.xml) en la carpeta dibujable, como esto.
<?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>
Ahora agregue un nuevo estilo y aplique splash_bg.xml como color de fondo.
<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>
Aplique este nuevo estilo a la actividad principal del lanzador oa la pantalla de bienvenida.
[Activity(Label = "label", MainLauncher = true, Theme = "@style/Theme.SplashBg")] public class SplashScreenActivity : Activity
Aquí hay algo de reflexión; Tal vez usted no tiene un retraso de inicialización considerable en su aplicación en absoluto; Usted puede ser que de hecho, esté esperando el servicio inmediato del funcionamiento .
Por lo que he experimentado, los síntomas de esto son que su aplicación muestra una pantalla larga negro mientras inicializa, pero al depurar encontrará que ninguno de los métodos onCreate
de su Application
/ Activity
onCreate
no han sido llamados mientras es visible.
- No se muestra el nombre de la aplicación de Android
- Cómo ajustar la altura de línea en TextView con varios tamaños de tipo?