2017-01-17 5 views
0

Я добавил выплеска экран моего приложения и мой код выглядит следующим образом:Splash Screen активность

public class SplashActivity extends AppCompatActivity { 

    public static final int DELAY_MILLIS = 2000;//for testing i use 5 seconds 
    private Handler handler = null; 

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

     handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       Intent intent = new Intent(SplashActivity.this, CurrencyExchangeActivity.class); 
       startActivity(intent); 
       finish(); 
      } 
     }, DELAY_MILLIS); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     handler.removeCallbacksAndMessages(null); 
    } 
} 

Мой Manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.vdovin.currencyratesapp"> 

    <uses-permission android:name="android.permission.INTERNET"/> 

    <application 
     android:name=".application.CurrencyApp" 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

     <activity 
      android:name=".screens.splash.SplashActivity" 
      android:theme="@style/SplashTheme"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

     <activity android:name=".screens.main.CurrencyExchangeActivity"> 
     </activity> 
    </application> 
</manifest> 

Так я столкнулся с следующей проблемой:

Если я скрыть мое приложение с помощью кнопки дома при загрузке заставки, а затем, когда я снова открою приложение, активность заставки не вызовет CurrencyExchangeActivity. Я понимаю, что он появляется, потому что метод onCreate() вызывается только один раз, но я не могу поместить его в onResume(), потому что, когда я снова открываю приложение, он снова показывает мне заставку. Но я хочу показать CurrencyActivity, например, приложения Google (карты, листы и т. Д.)

+0

Добавить файл манифеста слишком –

ответ

0

Вы не можете сделать это просто потому, что вы устанавливаете изображение экрана-заставки в качестве background из theme вашего Activity. Это фон на уровне окон, который будет отображаться независимо от вашей навигации или чего-либо еще.

Если вы действительно хотите отображать заставку только один раз в жизни приложения, тогда вам нужно будет сделать это в not the right way и иметь это изображение как часть вашего макета и раздуть этот макет, используя setContentView. Теперь, когда вы снова придете в приложение, вы назовете свой CurrencyExchangeActivity еще до setContentView из splash activity и который будет просто отображать фон черного окна и сразу показать CurrencyExchangeActivity.

Дайте мне знать, если это имеет смысл или нет. Я могу уточнить, если необходимо

+0

Считаете ли вы, что Google также делает это неправильно? – Vdovin

+0

@ Vdovin Какое приложение google вы говорите? –

+0

да, что-то вроде google maps, листы google – Vdovin

0

Пожалуйста, попробуйте этот путь. Я не тестировал ваш код. Мое раскачивание использования всплеска будет, как показано ниже:

public class SplashActivity extends Activity { 
private static final String TAG = SplashActivity.class.getSimpleName(); 
Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     loadNext(); 
    } 
}; 

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


    new Thread() { 
     @Override 
     public void run() { 
      try { 
       sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      handler.sendEmptyMessage(1); 
     } 
    }.start(); 
} 


protected void loadNext() { 
    Intent intent = new Intent(this, NextActivity.class); 
    startActivity(intent); 
    finish(); 
} 
} 
+0

Спасибо за ответ, но это не работает для меня. Через 5 секунд автоматически откроется CurrencyActivity. – Vdovin

+0

"активность заставки не вызовет CurrencyExchangeActivity" Я думал, что у вас есть проблемы с навигацией в currencyExchangeactivity –

+0

Нет, это не вызов функции обмена валюты, потому что метод onCreate вызывается только один раз, и я удаляю обратные вызовы из обработчика onStop, поэтому я, когда снова открываю приложение, я не вызываю onCreate, но я написал, почему я не помещаю обработчик в onResume – Vdovin

0

вы забыли добавить

setContentView(R.layout.splash);

добавить это будет работать

+0

Я делаю это через слой. https://www.bignerdranch.com/blog/splash-screens-the-right-way/ – Vdovin

0

Могут быть, вы можете попробовать следующее:

@Override 
protected void onResume() { 
    super.onResume(); 
    Intent intent = new Intent(this, CurrencyExchangeActivity.class); 
    startActivity(intent); 
    finish(); 
} 

Это пропустит задержку при повторном открытии приложения после нажав кнопку «Домой».

+0

Я скрываю приложение с кнопкой «домой» и снова открываю его. Я снова вижу экран всплеска, но я хочу увидеть CurrencyActivity – Vdovin

0

Обычно я использую postDelayed Runnable.

import android.content.Intent; 
import android.os.Bundle; 
import android.os.Handler; 
import android.support.v7.app.AppCompatActivity; 

public class MainActivity extends AppCompatActivity { 

    private Handler handler = new Handler(); 

    private Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      Intent intent = new Intent(this, NextActivity.class); 
      startActivity(intent); 
      finish(); 
     } 
    }; 

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


    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     // 5 sec 
     handler.postDelayed(runnable, 5000); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     // 5 sec 
     handler.removeCallbacks(runnable); 
    } 
} 
+0

Если я скрою приложение при загрузке заставки и снова открою его, я снова увижу заставку. Так что это не сработает для меня – Vdovin

+0

У вас нет этой проблемы, если вы выполнили postdelay в onResume(). Ошибка в вашем коде ti run runable onCreate(). – mcatta

0

Я хотел бы предложить сохранить механизм отображения заставки в CurrencyActivity в вашем случае. Вот псевдокод.

Я добавил соответствующие комментарии в код. Пожалуйста, проверьте.

public class CurrencyActivity extends AppCompatActivity { 

    public static final int DELAY_MILLIS = 2000; //for testing i use 5 seconds 
    private Handler handler = null; 
    private boolean showSplash = true; // True by default 
    private ImageView splashImage; 

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

     // Get a image overlaying the other views in your currency layout 
     splashImage = (ImageView) findViewById(R.id.splash); 

     if(showSplash) showSplashScreen(); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     handler.removeCallbacksAndMessages(null); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     showSplash = false; // Set the variable to false when you take this in background 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     // Check if the variable is false and then set the visibility to GONE 
     if(!showSplash) splashImage.setVisibility(View.GONE); 
    } 

    private void showSplashScreen() { 
     handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       splashImage.setVisibility(View.GONE); 
       showSplash = false; 
      } 
     }, DELAY_MILLIS); 
    } 
} 
0

Попробуйте out--

SplashScreenActivity-

public class SplashActivity extends AppCompatActivity { 

public static final int DELAY_MILLIS = 2000;//for testing i use 5 seconds 

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

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      Intent intent = new Intent(SplashActivity.this, CurrencyExchangeActivity.class); 
      startActivity(intent); 
      finish(); 
     } 
    }, DELAY_MILLIS); 
} 

}

Для manifest--

<?xml version="1.0" encoding="utf-8"?> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    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=".CurrencyExchangeActivity"/> 




</application> 

я тестировал этот код, если у вас была проблема, что при нажатии на кнопку домашнего экрана заставка отображается снова, то это будет работать ....