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

                                          }
                           }

首选项.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>
4

6 回答 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);
}
于 2013-05-14T06:31:41.363 回答
1

您唯一需要做的就是以这种方式将另一个 CheckBox 添加到您的首选项中:

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

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

于 2013-07-07T19:32:07.530 回答
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;
}
于 2013-07-08T07:55:40.683 回答
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();
          } 
       }
于 2013-07-13T12:14:43.793 回答
0

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

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

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

要实现 A,您需要使用 onPreferenceChange 方法。在此方法中,您将检查更改的首选项是否为真,如果是,则将其他两个首选项设置为假。如果所有三个首选项都为假,那么问题就来了,在这种情况下,您需要设置默认首选项,或者在 Splash Activity 类中执行默认操作。

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

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

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

另外,不要使用线程来运行计时器,而是使用类似这样的东西,这将有助于保持事情顺利并将计时器移出主线程。

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

希望有帮助。

于 2013-07-10T13:08:08.797 回答
0

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

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

您应该使用 user_data 作为键,当用户成功登录(登录)时,将用户 ID 存储在 user_data(键)中。使用 IF 条件我可以轻松识别 user_data(键)是否为空。如果 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 );
    }
}
于 2018-12-06T04:07:41.447 回答