与初始屏幕共享首选项

时间:2013-05-13 22:57:51

标签: java android sharedpreferences splash-screen

我的应用程序以带有音乐的启动画面开始,我使用共享偏好停止音乐,因此下次打开应用程序启动画面时仍然没有音乐。

我试图通过三个独立的不同复选框功能获取首选项屏幕,如果您选中一个复选框,则无法检查其他两个,如下所示:

第一个复选框:使用启动画面和音乐启动应用程序(通过以下代码实现),

第二个复选框:使用启动画面启动应用并且没有音乐(通过以下代码实现),

第三个复选框:启动应用,没有启动画面和音乐(未实现)。

任何帮助将不胜感激,谢谢

代码:

飞溅:

 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>

6 个答案:

答案 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 );
    }
}