Pytanie Jak usunąć biały ekran podczas ładowania aplikacji na Androida?


Jestem nowy na Androida. Mam widok internetowy, który ładuje adres URL. Problem polega na tym, że po uruchomieniu aplikacji wyświetlany jest biały ekran przez 2-3 sekundy po tym, jak ładowany jest adres URL widoku internetowego.

Myślę, że jest to czas, kiedy aplikacja się inicjuje. Jak mogę usunąć biały ekran i wyświetlić moje logo na ten czas? Słyszałem o ekranie powitalnym, ale tym, że logo pojawia się przez 1 sekundę, następnie pojawia się biały ekran przez kolejne 2-3 sekundy, a następnie w końcu ładuje się widok sieciowy.

Co ja robię źle? Czy jest to ekran powitalny lub jakiś inny sposób wyświetlania logo podczas ładowania ekranu sieciowego?

package com.exampe.dating;

import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.view.KeyEvent;
import android.view.Menu;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WebView mywebview = (WebView) findViewById(R.id.webview);
         mywebview.loadUrl("http://www.example.com/mobile/index.php");
         WebSettings webSettings = mywebview.getSettings();
         webSettings.setJavaScriptEnabled(true);
         mywebview.setWebViewClient(new WebViewClient());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        WebView mywebview = (WebView) findViewById(R.id.webview);
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mywebview.canGoBack()) {
            mywebview.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

splashActivity.java

package com.exampe.dating;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;

public class SplashActivity extends Activity {

       private static String TAG = SplashActivity.class.getName();
       private static long SLEEP_TIME = 10;    // 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.splash);

          // 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(SplashActivity.this, MainActivity.class);
             SplashActivity.this.startActivity(intent);
             SplashActivity.this.finish();
          }
       }
    }

androidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.exampe.dating"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8" />
<uses-permission android:name="android.permission.INTERNET" /> 
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
         <activity
         android:name=".SplashActivity">
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>

        <activity
            android:name="com.exampe.dating.MainActivity"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


    </application>

</manifest>

12
2018-01-28 18:25


pochodzenie


Byłoby pomocne, gdybyś pokazał kod, którego używasz do wyświetlenia ekranu powitalnego i załadowania widoku internetowego. - Ted Hopp
@TedHopp: Tak mi przykro, zapomniałem zaktualizować go tutaj. Proszę spojrzeć - Yahoo


Odpowiedzi:


To bardzo dziwne, że w twoim manifeście zadeklarowano takie działania. Powinieneś wyeliminować filtr intencji dla SplashActivity i po prostu zacznij SplashActivity z wewnątrz onCreate Twojego MainActivity:

EDYTOWAĆ Zaktualizowano, aby zastąpić spanie czekaniem. Ekran powitalny znika po załadowaniu strony lub po przekroczeniu limitu czasu, w zależności od tego, co nastąpi wcześniej.

public class MainActivity extends Activity {
    public static Object SPLASH_LOCK = new Object();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        WebView mywebview = (WebView) findViewById(R.id.webview);
        mywebview.loadUrl("http://www.example.com/mobile/index.php");
        WebSettings webSettings = mywebview.getSettings();
        webSettings.setJavaScriptEnabled(true);
        mywebview.setWebViewClient(new WebViewClient());

        startActivity(new Intent(this, SplashActivity.class));
    }
    . . .
}

// in your WebViewClient:
public void onPageFinished (WebView view, String url) {
    synchronized (SPLASH_LOCK) {
        SPLASH_LOCK.notifyAll();
    }
}    

Następnie w SplashActivity, zaczekaj na opóźnienie i po prostu zadzwoń finish(). Nie musisz zaczynać MainActivity znowu, ponieważ siedzi za SplashActivity i pojawi się, gdy SplashActivity kończy się.

public class SplashActivity extends Activity {

       private static String TAG = SplashActivity.class.getName();
       private static long MAX_SPLASH_TIME = 10000;

       @Override
       protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);

          . . .

          setContentView(R.layout.splash);

          new Thread() {
              @Override
              public void run() {
                  synchronized (MainActivity.SPLASH_LOCK) {
                      // wait for notify or time-out
                      try { MainActivity.SPLASH_LOCK.wait(MAX_SPLASH_TIME); }
                      catch (InterruptedException ignored) {}
                  }
                  finish();
              }
          }.start();
       }
       . . .
}

Zauważ, że nie potrzebujesz IntentLauncher klasa.

P.S. Nie pytałeś o to, ale jeśli dodasz to do SplashActivity tag w twoim manifeście:

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

to nie musisz dzwonić requestWindowFeature lub ustaw flagi okien w onCreate.


4
2018-01-28 18:54



Zminimalizowałem czas SLEEP_TIME = 1;   więc po 1 sekundzie pojawia się biały ekran przez 2-3 sekundy. Czy istnieje sposób, w którym nie muszę określać czasu snu? ponieważ czas ładowania może się różnić w zależności od urządzenia? Czy mam rację ? - Yahoo
@AdiMathur - Możesz spróbować Sztuczka Nicklasa używanie onPageFinished. To oddzwonienie występuje w twoim MainActivity więc potrzebujesz sposobu, aby przekazać to do SpashActivity. Najprostszym sposobem, jak sądzę, jest użycie statycznej zmiennej blokującej. Zamiast dzwonić Thread.sleep w SplashActivity, zsynchronizuj, a następnie poczekaj na obiekt blokady. Po zakończeniu strony zsynchronizuj i zadzwoń notifyAll() na obiekcie blokady. - Ted Hopp
@AdiMathur - zaktualizowałem swój kod, aby pokazać, jak to może działać. - Ted Hopp
Jesteś niesamowity ! :) - Yahoo
Jeśli kiedykolwiek będziesz w Ontario, kupię ci piwo. - ninehundredt


Teraz wyświetlasz powitalny, śpiąc i odrzucając powitanie w tym samym czasie, co uruchomienie głównej aktywności, która zaczyna się ładować stronę. Splash-> Sleep-> Uruchom i odrzuć Splash -> ładowanie strony

Powinieneś rozpocząć ładowanie strony podczas wyświetlania splash i usunąć powitanie po załadowaniu strony.

Możesz przesłonić

public void onPageFinished (WebView view, String url)

z WebViewClient to jest połączone z twoim WebView i spraw, by ta metoda odrzuciła plusk. Prawdopodobnie łatwiej jest mieć splash jako Dialog, a nie jako działanie.


2
2018-01-28 18:54