2016-04-06 7 views
2

Bevor ich in Problem beschreiben, möchte ich darauf hinweisen, dass ich die anderen Threads weiß, die diese Frage stellen aber für mich war keiner in der Lage, mein Problem zu lösen.Anzeige Splash-Bildschirm nur, wenn die App gestartet wird und nicht jedes Mal, wenn die Aktivität mit Splash-Screen-Code heißt

Der Unterschied zwischen zuvor gestellten Fragen und meine Frage ist, dass ich Splash-Screen-Code in der Hauptaktivität und NICHT in einer anderen Aktivität habe, so habe ich keine Layout-XML-Datei dafür.

Also, das Problem ist, ich will nur Splash-Screen angezeigt werden, wenn die Anwendung gestartet wird, und dies wird perfekt durch den folgenden Code getan, aber wenn die main activity (der Splash-Screen-Code enthält) wird durch eine andere Aktivität genannt Intent mit , wird der Begrüßungsbildschirm erneut angezeigt.

Also, zuerst habe ich versucht, flag Variable zu verwenden, 0 initiieren, wenn Aktivität erstellt wird und es um eins erhöhen, wenn Begrüßungsbildschirm einmal angezeigt wird. aber ich habe herausgefunden, dass es nicht funktioniert, weil es immer 0 wenn Aktivität erstellt wird.

So, jetzt versuche ich eine Zeichenfolge von der anderen Tätigkeit zu übergeben und zu versuchen, Splash-Screen wieder zu verhindern, wie in der folgenden Code dargestellt:

public class Registration extends ActionBarActivity { 

public final static String EXTRA_MESSAGE = "com.kaushal.myapplication.MESSAGE"; 

DatabaseHelper myDb; 
EditText username,password; 
private ImageView splashImageView; 
boolean splashloading = false; 
int flag=0; 


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


    String message = null; 
    Intent intent0 = getIntent(); 
    message = intent0.getStringExtra(Registration.EXTRA_MESSAGE);//string from another activity. 

    if(!message.equals("signup has called me")) { //splash screen code in `if` 
     splashImageView = new ImageView(this); 
     //splashImageView.setBackgroundColor(); 
     splashImageView.setImageResource(R.drawable.sexy); 
     setContentView(splashImageView); 
     splashloading = false; 
     Handler h = new Handler(); 

     h.postDelayed(new Runnable() { 
      public void run() { 
       splashloading = false; 
       setContentView(R.layout.activity_registration); 
       username = (EditText) findViewById(R.id.username); 
       password = (EditText) findViewById(R.id.password); 
      } 
     }, 3000); 
     flag++; 
    } 

    if(flag==0){ 
     username = (EditText) findViewById(R.id.username); 
     password = (EditText) findViewById(R.id.password); 
    } 

    myDb = new DatabaseHelper(this); 




} 
} 

Hier Registration ist der Name meiner Haupttätigkeit, die gestartet wird, wenn die App gestartet wird.

-Code der Methode einer anderen Aktivität sign Up benannt, die eine Zeichenfolge übergibt:

public void backToRegistration(View view){ 
    Intent intent0 = new Intent(this,Registration.class); 
    intent0.putExtra(EXTRA_MESSAGE, "signup has called me"); 
    startActivity(intent0); 
} 

Was ist das Problem mit dieser Methode? Die App stürzt unmittelbar nach dem Start ab.

+0

Fügen Sie die Startmodus-Eigenschaft in Ihre Hauptaktivitätsmanifestdatei ein. android: launchMode = "singleTop" –

+0

funktioniert nicht für die Hauptaktivität (Registrierung) –

+0

Aktivität, die für Splash-Bildschirm aufruft. Kommentiere deine Flaggen und anderen damit verbundenen Code. –

Antwort

1

Es gibt also eine Reihe von Problemen mit der Verwendung einer Zeichenfolge in einer Absicht als eine Flagge wie folgt. Strings sind nicht wirklich dafür eingerichtet. Der Overhead ist ein gutes Stück mehr als der eines einfachen primitiven booleschen Flags.

dies der Weg tun Sie derzeit

ändern onCreate Code zu diesem

super.onCreate(savedInstanceState); 

Intent intent0 = getIntent(); 
boolean showSplash = getIntent().getBooleanExtra(Registration.FLAG_KEY), true); 

handleSplashScreen(showSplash); 

Und fügen Sie diese Methode versuchen, die wir in einer etwas rekursive Art und Weise verwenden zu handhaben die zeigt, Begrüßungsbildschirm.

private void handleSplashScreen(boolean showSplash){ 
    if(showSplash) { //splash screen code in `if` 
     splashImageView = new ImageView(this); 
     //splashImageView.setBackgroundColor(); 
     splashImageView.setImageResource(R.drawable.sexy); 
     setContentView(splashImageView); 
     splashloading = false; 
     Handler h = new Handler(); 

     h.postDelayed(new Runnable() { 
      public void run() { 
       handleSplashScreen(false); 
      } 
     }, 3000); 
    } 
    else{ 
     splashloading = false; 
     setContentView(R.layout.activity_registration); 
     username = (EditText) findViewById(R.id.username); 
     password = (EditText) findViewById(R.id.password); 
    } 
} 

Dann, wenn Sie diese Tätigkeit von einer anderen Aktivität öffnen tun

public void backToRegistration(View view){ 
    Intent intent0 = new Intent(this,Registration.class); 
    intent0.putExtra(FLAG_KEY, false); 
    startActivity(intent0); 
} 

Wo FLAG_KEYprivate static FLAG_KEY = com.kaushal.myapplication.FLAG; ist und ersetzt die EXTRA_MESSAGE String.

Wie würde ich empfehlen, es

Jetzt tun, dass er sagt, ist dies nicht, wie ich empfehlen würde dies zu tun. Sie sollten einfach eine SplashScreenActivity haben, die beim Start aufgerufen wird und zu Ihrer Registration MainActivity umleitet.Dieses gets rid der Faltung einer Aktivität mit zwei verschiedenen Layouts, Fahnen mit etc.

public class SplashScreenActivity extends Activity{ 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_splash); 

     new Handler().postDelayed(new Runnable(){ 
      @Override 
      public void run(){ 
       startActivity(new Intent(SplashScreenActivity.this, MainActivity.class); 
       SplashScreenActivity.this.finish(); 
      } 
     }, 3000); 

    } 
} 

Wo R.layout.activity_splash wie diese

<?xml version="1.0" encoding="utf-8"?> 
<ImageView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:src="R.drawable.sexy" 
    android:scaleType="centerInside" /> 

sieht Dann könnte man MainActivity haben wie diese

Zuletzt, gehen Sie einfach in das Manifest und aktualisieren Sie es, so dass die neu erstellte SplashScreenActivity beim Start angezeigt wird und stellen Sie sicher, dass die MainActivity noch deklariert wird rot passend.

<activity 
    android:name=".SplashScreenActivity" 
    android:label="@string/app_name"> 

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

<activity 
    android:name=".MainActivity"/> 

Keine Flags mehr, keine Logik mehr, keine Probleme mehr. Es lädt den Begrüßungsbildschirm beim Start und das ist es. Die Aktivität endet, nachdem sie die Absicht passiert hat, sodass sie sich nicht mehr auf dem Stapel befindet. Alles ist gut. Der Grund, dass die anderen Fragen mit solchen Dingen umgehen, ist die empfohlene Art, einen Begrüßungsbildschirm zu erstellen.

+0

vielen Dank ..! jetzt geht es. –

Verwandte Themen