【问题标题】:sharedpreference with splash screen与闪屏的共享偏好
【发布时间】:2013-05-08 02:30:55
【问题描述】:

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

我正在尝试使用三个独立的不同复选框功能获取首选项屏幕,并且如果您选中一个复选框,则无法选中其他两个复选框,如下所示:

第一个复选框:启动带有闪屏和音乐的应用(通过以下代码实现),

第二个复选框:启动带有闪屏且不带音乐的应用(通过以下代码实现),

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

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

代码:

飞溅:

 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>

【问题讨论】:

  • 您是否想在 SharedPreferences 中写入,如果您的应用程序应该以启动画面开始?
  • @blackbelt 是的,例如。喜欢有 3 个复选框,如果选中第一个复选框,则应用程序将以启动画面和音乐开始,如果第二个选中的应用程序以启动画面而没有音乐启动,如果选中的应用程序启动时没有启动画面且没有音乐,最后只有一个复选框被选中,谢谢跨度>
  • 在 Prefs 中,您想在 sharedpreferences 中写入这些值吗?
  • @blackbelt,亲爱的,还有另一种方法可以实现 3 个复选框,其与我的帖子相关的功能与我预期的不同,非常感谢
  • @androidqq6 除非您的应用程序非常出色,否则您的应用程序很可能不会有“下一次”:)

标签: java android sharedpreferences splash-screen


【解决方案1】:

切勿在活动中使用睡眠方法。 android 中的 Shared Preference 用于存储键值对。您可以在共享首选项中存储整数、布尔值、字符串、浮点数等。您需要做的只是给您想要存储的值(值)一个名称(键)。在那里,您将仅使用共享首选项编辑器执行所有共享首选项任务。所以流程是——初始化编辑器,存储key-value并调用editor.commit()来存储所有的变化。

我希望您对共享偏好有所了解。所以我们的任务是在应用启动时显示启动画面。启动画面将向用户显示 3-5 秒,然后将显示登录屏幕或直接主屏幕(如果用户已经登录)。那么系统将如何判断用户已经登录还是新用户首次访问呢? Please Check complete code here

您应该使用 user_data 作为密钥,当用户成功登录(登录)时,将用户 id 存储在 user_data(key)中。使用 IF 条件我可以轻松识别 user_data(key)是否为空。如果 user_data (key) 有一些值表示用户已经登录,那么让用户进入主屏幕,否则显示登录屏幕。

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

【讨论】:

    【解决方案2】:

    我达到了我所寻求的解决方案的一半,这是三个不同的功能复选框,如下面的代码,但我仍然无法让它们独立检查。

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

    【讨论】:

      【解决方案3】:

      据我所知,您希望发生以下情况:

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

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

      要实现 A,您需要使用 onPreferenceChange 方法。在此方法中,您将检查更改的首选项是否为真,如果是,则将其他两个首选项设置为假。如果所有三个首选项都为 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);
      

      希望对您有所帮助。

      【讨论】:

        【解决方案4】:

        我建议您将复选框替换为收音机以达到第 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 你的意思是枚举吗?由您决定要放置它。查看您当前的方法,我建议您为其创建单独的 .java 文件。
        • 亲爱的我很抱歉,但我是 android 新手,我不知道如何应用你的代码你能解释更多或重新排列你的代码以及在哪里以及如何应用它,非常感谢
        【解决方案5】:

        您唯一需要做的就是以这种方式将另一个 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,就打开新的activity:

        飞溅

         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 开发以来的一些提示:

        无论如何,祝你的项目好运!

        【讨论】:

        • 我有 3 个按钮的选项菜单(关于、首选项、退出),当我安装应用程序并打开首选项时,默认选中两个复选框,运行带有启动画面和音乐的应用程序,假设您未选中第一个选项禁用启动画面或取消选中启动画面和添加音乐,然后按返回然后按退出,退出应用程序,然后再次重新打开应用程序并按首选项并启用启动画面或启用启动画面和音乐,然后按返回然后按退出(这是问题),选项菜单消失,但应用程序不退出您必须再次按首选项以升起选项菜单,然后再次按退出现在它退出应用程序任何建议解决它,谢谢
        • 查看此链接:developer.android.com/guide/topics/manifest/…,将noHistory 标志放入启动画面活动可能会解决您的问题。但我不确定,因为我不太了解您的问题!
        • 我的意思是在检查splash是否启用退出按钮后第一次点击不响应点击,你必须点击它两次退出应用程序,我会尝试onHistory来解决它
        • android:noHistory="true" 没有解决,任何建议,谢谢
        • 好吧,那可能是另一个问题。您应该打开另一个线程并更明确地说明这个问题:真正发生了什么,显示您的 AndroidManifest...
        【解决方案6】:
            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);
        }
        

        【讨论】:

        • 并添加 getPrefs.setBoolean("checkbox",false);在你的暂停
        • 我的朋友,上面回答的代码导致两个选项:1-如果复选框导致开始播放音乐或 2-如果未选中应用程序启动时完全没有启动画面和音乐,但我想添加另一个选项是在没有音乐的情况下开始飞溅,所以最后我们有 3 个选项:1- 没有飞溅和音乐 .2- 有飞溅但没有音乐 .3- 有飞溅和音乐,请问我们如何实现这一点,非常感谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-08
        • 1970-01-01
        • 2014-07-29
        • 2019-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多