使用共享首选项和意图 - 设置和设置应用程序

时间:2017-03-12 17:01:48

标签: android

我目前正在开发一个应用程序,它在第一次打开应用程序时显示设置界面和应用程序打开的后续时间,它显示了设置界面。我实现这一点的方法是,一旦我的应用程序打开,它会检查共享首选项是否为空。如果共享首选项为null,则表示它是第一次打开应用程序,它将在共享首选项中设置一个值。然后,下次打开应用程序时,选中共享首选项时,它不再为null,并将转到设置界面。问题是,当我第一次运行它时,它只显示没有状态栏或任何东西的白色屏幕。以下是我的应用程序的代码片段

 private void saveSharedPref()
{
    SharedPreferences preferences = getSharedPreferences(SHARED_PREFERENCES_FILE, 0);
    SharedPreferences.Editor editor = preferences.edit();

    //Save values from Edit Text Controls
    editor.putString("firstTime", "1234");
    editor.commit();
}

private void loadSharedPreferences()
{
    SharedPreferences preferences = getSharedPreferences(SHARED_PREFERENCES_FILE, 0);

    //Null check in case file does not exist
    if(preferences != null) {
        String checkFirst = preferences.getString("firstTime", "");
        if (!checkFirst.equalsIgnoreCase("1234"))
        {
            Intent sendToSetup = new Intent (this, Setup.class);
            startActivity(sendToSetup);
        }
        else
        {
            saveSharedPref();
        }
    }
}

我在onCreateMethod

中调用了loadSharedPreferences()
public class Setup extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.setup_pg1);
}

当用户第一次打开应用程序时,这就是应用程序被重定向的地方。

非常感谢任何帮助。提前致谢! 附:抱歉,如果我的英语不好

编辑: 这是androidmanifest

<?xml version="1.0" encoding="utf-8"?>

<application
    android:allowBackup="true"
    android:icon="@drawable/icon1"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity
        android:name=".SafeSwipe"
        android:label="SafeSwipe-UI v.2"
        android:theme="@style/AppTheme.NoActionBar">
    </activity>
    <activity
        android:name=".MainActivity"
        android:label=""
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".Setup" />
</application>

setup_pg1

<TextView
    android:text="Setup"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="102dp"
    android:id="@+id/textView" />

<Button
    android:text="Continue"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textView"
    android:layout_alignRight="@+id/textView"
    android:layout_alignEnd="@+id/textView"
    android:layout_marginTop="71dp"
    android:id="@+id/button7" />

设置文件

public class Setup extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.setup_pg1);
}

}

4 个答案:

答案 0 :(得分:1)

首先,if(preferences != null)永远不会成为现实,因为您始终会从getSharedPreferences()

获取非空值
  

我在onCreate方法

中调用loadSharedPreferences()

不,你不......这里是你的代码

public class Setup extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.setup_pg1);
    }
}

再试一次。但是使用布尔值而不是一些随机字符串。

public class MainActivity extends AppCompatActivity {

    public static final String PREFS_NAME = "MyPrefsFile";
    public static final String KEY_FIRST_TIME = "firstTime";

    @Override
    protected void onCreate(Bundle b){
       super.onCreate(b);
       setContentView(R.layout.activity_main);

       SharedPreferences prefs = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
       boolean firstTime = prefs.getBoolean(KEY_FIRST_TIME, false);

       if (!firstTime) {
           SharedPreferences.Editor editor = prefs.edit();
           editor.putBoolean(KEY_FIRST_TIME, true);
           editor.commit();    
       } else {
           Intent sendToSetup = new Intent (this, Setup.class);
           startActivity(sendToSetup);
           finish();
       }
    }
}

答案 1 :(得分:0)

您的if(preferences != null)在此处无效,原因偏好不为空。这只是一个空洞的偏好。您可以尝试以下代码:

private void loadSharedPreferences()
{
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    String checkFirst = preferences.getString("firstTime", "");
    if(!checkFirst.equals("")) {        
        Intent sendToSetup = new Intent (this, Setup.class);
        startActivity(sendToSetup);
    }
    else
    {
        saveSharedPref();
    }
}

saveSharedPref()方法:

private void saveSharedPref()
{
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);

    //Save values from Edit Text Controls
    preferences.edit().putString("firstTime", "1234").apply();

}

在设置活动的loadSharedPreferences()中致电onCreate()

希望这有帮助。

答案 2 :(得分:0)

试试这个: 而不是检查首选项!= null试试这个..

if (preferences.getString("firstTime","").equals("1234"))
{
     Intent sendToSetup = new Intent (this, Setup.class);
     startActivity(sendToSetup);
}
else
     saveSharedPref();

答案 3 :(得分:0)

我在这段代码中没有看到任何关键问题。但我假设您在测试程序时调用了'&&'方法,并且saveSharedPref()的值已经存在。因为在重新编译程序后不会删除SharedPreferences:

firstTime

给出错误。 检查此问题的最佳方法是在if (!checkFirst.equalsIgnoreCase("1234")) 方法中设置断点并进行验证。 如果是这样,请尝试删除sharedPreferences(请参阅答案https://stackoverflow.com/a/3687333/7677939

或简单地在loadSharedPreferences()变量中提供另一个文件名。

也可能是您拨打SHARED_PREFERENCES_FILE的问题,但我无法在您的来源中看到它。

<强>更新  请注意,您不应在loadSharedPreferences()活动中致电 loadSharedPreferences(),您应该在主要活动中调用它!