SharedPreference与闪屏界面

5

我的应用程序通过带有音乐的启动画面开始,我使用 sharedpreference 停止音乐,这样下次打开应用程序时,启动画面仍然存在但没有音乐。

我试图获取具有三个独立不同选中框功能的首选项屏幕,并且如果您选择一个选中框,则无法选择其他两个,如下所示:

第一个选中框:使用下面的代码启动带有启动画面和音乐的应用程序(已实现)。

第二个选中框:使用下面的代码启动不带音乐的启动画面的应用程序(已实现)。

第三个选中框:启动没有启动画面和有音乐的应用程序(未实现)。

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

代码:

启动画面:

 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();
          } 
       }

首选项:

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>

1
你想在SharedPreferences中写入内容吗?如果你的应用程序应该从闪屏界面开始,还是直接进入主界面? - Blackbelt
@blackbelt 是的,亲爱的。 - androidqq6
2
@blackbelt 亲爱的,除了我预期的方式之外,是否还有另一种实现具有不同功能的3个选中框的方法?非常感谢。 - androidqq6
如果我安装了你的应用程序,请确保我会因为闪屏音乐而讨厌你。 - Marcin Orlowski
1
除非你的应用程序非常惊人,否则很可能不会有下一次机会 :) - Marcin Orlowski
显示剩余3条评论
6个回答

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

在你的onPause中添加getPrefs.setBoolean("checkbox",false);。 - prvn
我的朋友上面回答的代码有两个选项的结果:1-如果复选框导致启动带有音乐的闪屏或2-如果未选中,则应用程序完全没有闪屏和音乐,但我想添加另一个选项,即启动不带音乐的闪屏,因此最终我们有3个选项:1-没有闪屏和音乐。 2-带有闪屏但没有音乐。 3-带有闪屏和音乐,请问我们如何实现这一点,非常感谢。 - androidqq6

1
您需要做的唯一事情就是在您的首选项中添加另一个复选框,方法如下:

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开发,给你一些提示:

祝你的项目顺利!


我有一个选项菜单,包括三个按钮(关于,设置,退出)。当我安装应用并打开设置时,默认情况下两个复选框都被选中,而应用程序带有启动画面和音乐。假设您取消选中第一个选项以禁用启动画面或者取消选中启动画面和添加音乐,然后按返回键,再按退出键,则它将退出应用程序。重新打开应用程序并按设置键,启用启动画面或同时启用启动画面和音乐,然后按返回键,再按退出键(这里出现了问题),选项菜单消失但应用程序没有退出,您必须再次按设置键来弹出选项菜单,然后再按退出键才能退出应用程序。请问如何解决这个问题,谢谢。 - androidqq6
看看这个链接:http://developer.android.com/guide/topics/manifest/activity-element.html#nohist,可能会解决你在启动屏幕活动中设置“noHistory”标志的问题。但我不确定,因为我不太理解你在这里的问题! - MagicMicky
我是指在检查启动画面是否启用后,退出按钮不响应单击。从第一次单击开始,您必须单击两次才能退出应用程序。我将尝试使用onHistory来解决这个问题。 - androidqq6
android:noHistory="true"并不能解决它,有什么建议吗,谢谢。 - androidqq6
亲爱的,我的代码中没有这个问题,在应用了你的答案代码后它出现了。我可以从我的应用程序中删除退出按钮,但是返回按钮仍然不能在第一次点击时响应,必须点击两次才能返回。请帮助我解决这个问题。 - androidqq6
显示剩余3条评论

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
}

为了更好的代码可读性,我建议您创建一个枚举,该枚举将从共享首选项值创建,例如:
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;
}

亲爱的,我应该把上面的类放在Splash类还是Prefs类中呢?谢谢。 - androidqq6
@androidqq6 你是指枚举吗?放在哪里取决于你自己。根据你目前的方法,我建议你为其创建一个单独的.java文件。 - dant3
亲爱的,很抱歉我是新手,不太懂如何应用你的代码。能否请您再解释一下或者重新排版一下代码,并告诉我在哪里以及如何应用它呢?非常感谢! - androidqq6

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();
          } 
       }

0

从我的理解来看,您想要以下操作:

A. 用户选择其中一个复选框,然后其他两个将被设置为false

B. 当应用程序启动时,它会检查首选项并播放/不播放音乐,显示/不显示闪屏。

要实现A,您需要使用onPreferenceChange方法。在此方法中,您将检查首选项是否更改为true,如果是,则将另外两个首选项设置为false。问题在于,如果所有三个首选项都为false,则需要设置默认首选项或在Splash Activity类中执行默认操作。

这样就可以确保只有一个首选项设置为true。我会将这三个首选项放在首选项类别中以向用户显示它们已分组。处理此情况的首选方法是通过单选按钮组,它始终确保选择了一个选项。

B. 在您的Splash活动中,我会将调用下一个活动的呼叫提取到单独的方法中(将finish()调用移动到此方法中),然后在onCreate()方法中检查首选项设置。如果首选项是跳过闪屏,请调用startNextActivity方法,否则进入等待线程,并使用适当的音乐设置继续进行onResume()方法。

你的示例代码中没有包含任何onResume()代码,这是你应该开始播放音乐的地方。另外,我建议将停止音乐和finish()的调用移动到提取的startNextActivity()方法中。

此外,不要使用线程来运行计时器,而是使用类似以下的内容,这将有助于保持流畅,并将计时器移出主线程。

new Handler().postDelayed(new Runnable() {
    public void run() {
        startNextActivity();
    }
}, SPLASH_DISPLAY_LENGTH);

希望这有所帮助。

0

在活动中永远不要使用sleep方法。Android中的Shared Preference用于存储键值对。您可以在Shared Preference中存储整数、布尔值、字符串、浮点数等。您只需要为要存储的值(value)指定一个名称(key)。您将使用共享首选项编辑器执行所有共享首选项任务。因此,流程是-初始化编辑器,存储键值并调用editor.commit()以存储所有更改。

我希望您了解有关共享首选项的想法。因此,我们的任务是在应用程序启动时显示闪屏屏幕。闪屏屏幕将显示给用户3-5秒钟,然后它将显示登录屏幕或直接进入主屏幕(如果用户已经登录)。那么系统如何确定用户已经登录还是新用户的第一次访问?请在此处检查完整代码

您应该使用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 );
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接