我的应用程序以带有音乐的启动画面开始,我使用共享偏好停止音乐,因此下次打开应用程序启动画面时仍然没有音乐。
我试图通过三个独立的不同复选框功能获取首选项屏幕,如果您选中一个复选框,则无法检查其他两个,如下所示:
第一个复选框:使用启动画面和音乐启动应用程序(通过以下代码实现),
第二个复选框:使用启动画面启动应用并且没有音乐(通过以下代码实现),
第三个复选框:启动应用,没有启动画面和音乐(未实现)。
任何帮助将不胜感激,谢谢
代码:
飞溅:
public class Splash extends Activity{
MediaPlayer ourSong;
@Override
protected void onCreate(Bundle savedInstanceState) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
ourSong = MediaPlayer.create(Splash.this, R.raw.splashsound);
SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences
(getBaseContext());
boolean music = getPrefs.getBoolean("checkbox", true);
if (music == true)
ourSong.start();
Thread timer = new Thread(){
public void run(){
try{
sleep(1000); }
catch (InterruptedException e){
e.printStackTrace(); }
finally{
Intent openMainActivity = new Intent("com.test.demo.MENU");
startActivity(openMainActivity); }}
};
timer.start(); }
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
ourSong.release();
finish();
}
}
Prefs:
public class Prefs extends PreferenceActivity{
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
Boolean customTitleSupported = requestWindowFeature
(Window.FEATURE_CUSTOM_TITLE);
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
}
}
的prefs.xml:
<?xml version="1.0" encoding="utf-8" ?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference android:title="splash screen music"
android:defaultValue="true"
android:key="checkbox"
android:summary="remove mark to stop music when splash start" />
</PreferenceScreen>
答案 0 :(得分:1)
SharedPreferences getPrefs =PreferenceManager.getDefaultSharedPreferences(getBaseContext());
boolean music = getPrefs.getBoolean("checkbox");
if (music == true)
{
setContentView(R.layout.splash);
ourSong = MediaPlayer.create(Splash.this, R.raw.splashsound);
ourSong.start();
Thread timer = new Thread()
{
public void run()
{
try
{
sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
finally
{
Intent openMainActivity = new Intent("com.test.demo.MENU");
startActivity(openMainActivity);
}
}
};
timer.start();
}
}
else
{
Intent openMainActivity = new Intent("com.test.demo.MENU");
startActivity(openMainActivity);
}
答案 1 :(得分:1)
您唯一需要做的就是以这种方式向您的偏好添加另一个CheckBox:
<强>的prefs.xml 强>
<?xml version="1.0" encoding="utf-8" ?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference android:title="splash screen"
android:defaultValue="true"
android:key="splash"
android:summary="Start a spashscreen" />
<CheckBoxPreference android:title="splash screen music"
android:defaultValue="true"
android:key="splash_music"
android:summary="Add some music to the splashscreen" />
</PreferenceScreen>
现在,您只需检查“splash”的值即可知道是否需要显示启动画面。如果它等于false,只需打开新活动:
<强>闪强>
public class Splash extends Activity{
MediaPlayer ourSong;
@Override
protected void onCreate(Bundle savedInstanceState) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
boolean splash = getPrefs.getBoolean("splash", true);
if(!splash) {
Intent openMainActivity = new Intent("com.test.demo.MENU");
startActivity(openMainActivity);
}
ourSong = MediaPlayer.create(Splash.this, R.raw.splashsound);
SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences
(getBaseContext());
boolean music = getPrefs.getBoolean("splash_music", true);
if (music == true)
ourSong.start();
Thread timer = new Thread(){
public void run(){
try{
sleep(1000); }
catch (InterruptedException e){
e.printStackTrace(); }
finally{
Intent openMainActivity = new Intent("com.test.demo.MENU");
startActivity(openMainActivity); }}
};
timer.start(); }
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
ourSong.release();
finish();
}
}
编辑:自从我看到你刚刚开始在Android开发中提出一些提示:
无论如何,祝你的项目好运!
答案 2 :(得分:1)
我建议你用无线电替换复选框到达第3点。
像这样:
<?xml version="1.0" encoding="utf-8" ?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
android:title="Splash settings"
android:summary="Select the way splash works"
android:key="splashPref"
android:defaultValue="0"
android:entries="@array/listArray"
android:entryValues="@array/listValues" />
</PreferenceScreen> <!-- you can use anything as value - int or string -->
然后在你的代码中:
...
int splashType = getPrefs.getInt("splashPref", 0);
switch (splashType) {
case 2:
// skip splash
case 1:
// only splash without music
default:
case 0:
// splash with music
}
为了获得更好的代码可读性,我建议您创建将使用共享prefences值创建的枚举,例如:
public enum SplashPreferenceValue {
SPLASH_WITH_MUSIC(0),
SPLASH_WITHOUT_MUSIC(1),
NO_SPLASH(2);
private int value;
private SplashPreferenceValue(int value) {
this.value = value;
}
public static SplashPreferenceValue fromInt(int value) {
return new SplashPreferenceValue(value);
}
};
...
SplashPreferenceValue splashType = SplashPreferenceValue.fromInt(getPrefs.getInt("splashPref", 0));
switch (splashType) {
case NO_SPLASH:
// skip splash
break;
case SPLASH_WITHOUT_MUSIC:
// only splash without music
break;
default:
case SPLASH_WITH_MUSIC:
// splash with music
break;
}
答案 3 :(得分:1)
我达到了我所寻求的一半解决方案,这是三个不同的功能检查框,如下面的代码,但我仍然无法让他们独立检查。
public class Splash extends Activity{
MediaPlayer ourSong;
@Override
protected void onCreate(Bundle savedInstanceState) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
boolean without_splash_screen = getPrefs.getBoolean("without_splash_screen", true);
if (without_splash_screen == true)
{
Intent intent = new Intent(Splash.this, MainActivity.class);
startActivity(intent);
}
boolean splash = getPrefs.getBoolean("splash", true);
if(splash == true) {
setContentView(R.layout.splash);
Thread timer = new Thread()
{
public void run()
{
try
{
sleep(2000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
finally
{
Intent intent = new Intent(Splash.this, MainActivity.class);
startActivity(intent);
}
}
};
timer.start();
}
ourSong = MediaPlayer.create(Splash.this, R.raw.splashsound);
SharedPreferences getPrefs1 = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
boolean music = getPrefs1.getBoolean("splash_music", true);
if (music == true)
ourSong.start();
Thread timer = new Thread(){
public void run(){
try{
sleep(2000); }
catch (InterruptedException e){
e.printStackTrace(); }
finally{
Intent intent = new Intent(Splash.this, MainActivity.class);
startActivity(intent); }}
};
timer.start(); }
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
ourSong.release();
finish();
}
}
答案 4 :(得分:0)
根据我的理解,您希望发生以下情况:
一个。用户选择其中一个复选框,然后将其他两个设置为假
B中。当应用程序启动时,它会检查首选项并播放/不播放音乐,显示/不显示启动画面。
要实现A,您需要使用onPreferenceChange方法。在此方法中,您将检查更改的首选项是否为true,如果是,则将其他两个首选项设置为false。如果所有三个首选项都为false,则会出现问题,在这种情况下,您需要设置默认首选项,或者在Splash Activity类中执行默认操作。
这应该注意确保只有一个首选项设置为true。我会将三个首选项放在首选项类别中,以向用户显示它们的分组。处理这种情况的首选方法是通过一个单选按钮组,它始终确保始终选择一个选项。
B中。在你的Splash活动中,我将提取调用以启动下一个活动到一个单独的方法(对此方法移动finish()调用),然后在onCreate()方法中检查首选项设置。如果首选项是跳过flash,则调用startNextActivity方法,否则进入等待线程并继续使用相应音乐设置的onResume()方法。
您的示例代码中没有包含任何onResume()代码,这是您应该启动音乐的地方。此外,我会调用停止音乐和finish()到提取的startNextActivity()方法。
而不是使用Thread来运行计时器,而是使用类似这样的东西来帮助保持平滑并将计时器从主线程移开。
new Handler().postDelayed(new Runnable() {
public void run() {
startNextActivity();
}
}, SPLASH_DISPLAY_LENGTH);
希望有所帮助。
答案 5 :(得分:0)
切勿在活动中使用睡眠方法。 android中的Shared Preference用于存储键值对。您可以在共享首选项中存储整数,布尔值,字符串,浮点数等。您所要做的只是给要存储的值(值)取一个名称(键)。在那里,您将仅使用共享首选项编辑器执行所有共享首选项任务。因此,过程是–初始化编辑器,存储键值并调用editor.commit()来存储所有更改。
希望您对共享首选项有所了解。因此,我们的任务是在应用启动时显示启动屏幕。启动画面将显示3-5秒,然后将显示登录画面或直接主画面(如果用户已经登录)。那么系统将如何确定该用户已经登录,或者这是新用户的首次访问? Please Check complete code here
您应该使用user_data作为密钥,当用户成功登录(登录)时,将用户ID存储在user_data(密钥)中。使用IF条件,我可以轻松地识别user_data(密钥)是否为空。如果user_data(键)具有某个值,表示用户已经登录,那么让该用户进入HOME屏幕,否则显示登录屏幕。
package blueappsoftware.shopeasy.splash;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.PersistableBundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import blueappsoftware.shopeasy.R;
import blueappsoftware.shopeasy.Utility.Constant;
import blueappsoftware.shopeasy.Utility.SharePreferenceUtils;
import blueappsoftware.shopeasy.home.HomeActivity;
import blueappsoftware.shopeasy.login.SigninActivity;
/**
* Created by kamal_bunkar on 03-12-2018.
*/
public class SplashActivity extends AppCompatActivity {
private String TAG ="splashAcctivity";
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
init();
// Log.e(TAG, " splash start showing");
}
public void init(){
new Handler().postDelayed( new Runnable() {
@Override
public void run() {
/// if user registered user
// then show home screen
// else show login screen
// key register_user
// Log.e(TAG, " counter running ");
if (SharePreferenceUtils.getInstance().getString(Constant.USER_DATA).equalsIgnoreCase("")){
// not registted user so show login screen
Intent intent = new Intent(SplashActivity.this, SigninActivity.class);
startActivity(intent);
}else {
// home sscreen
Intent intent = new Intent(SplashActivity.this, HomeActivity.class);
startActivity(intent);
}
finish();
}
}, 3000 );
}
}