如果第一次没有运行,如何让应用程序转到另一个页面

时间:2016-12-13 09:54:36

标签: android button sharedpreferences

我有RegisterPageLoginPage。当应用程序运行时,它将检查应用程序是否在RegisterPage中首次运行。如果它是第一次运行且未单击保存button,则它将在RegisterPage中。如果它第二次运行但从未点击保存按钮,它也将保留在RegisterPage。否则它将转到LoginPage

这是我更新的代码

注册

appGetFirstTimeRun();
boolean clicked=false;

 buttonSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                clicked=true;
                int appCurrentBuildVersion = BuildConfig.VERSION_CODE;
                SharedPreferences appPreferences = getSharedPreferences("MyAPP", 0);
                appPreferences.edit().putInt("app_second_time",
                        appCurrentBuildVersion).apply();
                String name = editTextName.getText().toString();
                String pass = editTextPassword.getText().toString();
                String confirm = editTextConfirm.getText().toString();
                if ((editTextName.getText().toString().trim().length() == 0) || (editTextPassword.getText().toString().trim().length() == 0) || (editTextConfirm.getText().toString().trim().length() == 0)) {
                    Toast.makeText(getApplicationContext(), "Field cannot be null", Toast.LENGTH_LONG).show();
                } 
                else
                 {
                      insertData(name, pass, imageUri); // insert to SQLite
                      Intent intent = new Intent(MainActivity.this, AddMonthlyExpenses.class);
                      intent.putExtra("name", name);
                      startActivity(intent);
                  }
            }
        });

  private int appGetFirstTimeRun() {

        //Check if App Start First Time
        SharedPreferences appPreferences = getSharedPreferences("MyAPP", 0);
        int appCurrentBuildVersion = BuildConfig.VERSION_CODE;
        int appLastBuildVersion = appPreferences.getInt("app_first_time", 0);

        if (appLastBuildVersion == appCurrentBuildVersion && clicked) {
            Intent intent = new Intent(MainActivity.this,LoginPage.class);
            startActivity(intent);
            return 1;
        } else {
            appPreferences.edit().putInt("app_first_time",
                    appCurrentBuildVersion).apply();
            if (appLastBuildVersion == 0) {
                Toast.makeText(getApplicationContext(), "First time", Toast.LENGTH_SHORT).show();
                return 0; //es la primera vez
            } else {
                return 2; //es una versión nueva
            }
        }
    }

问题是当我单击“保存”按钮并退出应用程序时。当我再次运行应用程序时,它仍然在RegisterPage中,而不是在LoginPage中。

9 个答案:

答案 0 :(得分:6)

将数据插入SQLite后单击检查按钮,这样您就可以确认您的数据已成功保存,然后您可以进入下一个屏幕。

在下面的代码中找到我的评论并编辑您的代码: -

public class Register extends AppCompatActivity {
    Button buttonSave;
    boolean clicked=false;//remove this
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        appGetFirstTimeRun();//call this method here
        buttonSave=(Button)findViewById(R.id.button);
        buttonSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                clicked=true;//remove this
                int appCurrentBuildVersion = BuildConfig.VERSION_CODE;
                SharedPreferences appPreferences = getSharedPreferences("MyAPP", 0);
                appPreferences.edit().putInt("app_second_time", appCurrentBuildVersion).apply();

                String name = editTextName.getText().toString();
                String pass = editTextPassword.getText().toString();
                String confirm = editTextConfirm.getText().toString();
                if ((editTextName.getText().toString().trim().length() == 0) || (editTextPassword.getText().toString().trim().length() == 0) || (editTextConfirm.getText().toString().trim().length() == 0)) {
                    Toast.makeText(getApplicationContext(), "Field cannot be null", Toast.LENGTH_LONG).show();
                }
                else
                {
                    insertData(name, pass, imageUri); // insert to SQLite
                    appPreferences.edit().putBoolean("btn_clicked", true).apply();//add this line
                    Intent intent = new Intent(Register.this, AddMonthlyExpenses.class);
                    intent.putExtra("name", name);
                    startActivity(intent);
                }
            }
        });
    }
    private int appGetFirstTimeRun() {

        //Check if App Start First Time
        SharedPreferences appPreferences = getSharedPreferences("MyAPP", 0);
        int appCurrentBuildVersion = BuildConfig.VERSION_CODE;
        int appLastBuildVersion = appPreferences.getInt("app_first_time", 0);
        boolean is_btn_click=appPreferences.getBoolean("btn_clicked",false);//add this line

        if ((appLastBuildVersion == appCurrentBuildVersion) && is_btn_click) { //edit this line like this
            Intent intent = new Intent(Register.this,LoginPage.class);
            startActivity(intent);
            return 1;
        } else {
            appPreferences.edit().putInt("app_first_time",
                    appCurrentBuildVersion).apply();
            if (appLastBuildVersion == 0) {
                Toast.makeText(getApplicationContext(), "First time", Toast.LENGTH_SHORT).show();
                return 0; //es la primera vez
            } else {
                return 2; //es una versión nueva
            }
        }
    }
}

答案 1 :(得分:4)

您依赖于SharedPreferences以及clicked变量,您可以依赖SharePreferences但不依赖于变量,因为在每次运行时您都将clicked value设置为false。

1)单击按钮时优先保存当前版本

appPreferences.edit().putInt("app_first_time",
                appCurrentBuildVersion).apply();

2)单击按钮时优先保存点击的值

appPreferences.edit().putBoolean("clicked",
                true).apply();

现在在appGetFirstTimeRun()内部获取版本的值并点击SharedPreferences

int appLastBuildVersion = appPreferences.getInt("app_first_time", 0);
boolean clicked = appPreferences.getBoolean("clicked", false);

答案 2 :(得分:2)

您还需要在单击“保存”按钮时更改共享首选项值。然后,只有下次打开app时,appGetFirstTimeRun方法才会加载Login页面。

在你的btnSave点击监听器,你在startActivity添加此代码之前开始活动的意图

int appCurrentBuildVersion = BuildConfig.VERSION_CODE;
    SharedPreferences appPreferences = getSharedPreferences("MyAPP", 0);

   appPreferences.edit().putInt("app_first_time",
                appCurrentBuildVersion).apply();

答案 3 :(得分:1)

onCreate();方法的 开始 中,致电checkStages();

buttonSave.onClick()方法的 结束 中,调用Prefs.putStage(this, 1);后跟checkStages();

/*Prefs.getStage(this) default value is 0*/

public void checkStages() {

    switch(Prefs.getStage(this)) {
        case 1: //Login Page
            startActivity(new Intent(this, LoginPage.class));
            finish();
            break;
        default:
            break;
    }
}

这是我用来编写任何Android应用的示例 Android Application Template

您可以从此项目中获取 Prefs

答案 4 :(得分:0)

将此代码添加到初始屏幕

 SharedPreferences wmbPreference = PreferenceManager.getDefaultSharedPreferences(context);
    boolean isFirstRun = wmbPreference.getBoolean("FIRSTRUN", false);
    if (!isFirstRun) {
startActivity(new Intent(context,RegirstorActivity.class));
}else{
startActivity(new Intent(context,LoginActivty.class));
}

所以基本上它会决定是否第一次(用户注册),注册后更新SharedPreferences

答案 5 :(得分:0)

您正在使用点击变量来识别是否点击了按钮但是当您从应用程序中存在时再次点击值重置为false所以不是在点击变量中保存值而是可以使用共享首选项来保存值true或false单击按钮并从共享首选项中获取值以检查

点击保存按钮

   appPreferences.edit().putInt("app_second_time",
                    appCurrentBuildVersion).apply();   

答案 6 :(得分:0)

我认为这可能就是答案。你的代码clicked boolean变量没有存储在共享首选项中,但你正在检查appGetFirstTimeRun()中的条件(第二次启动时可能没有点击按钮,但你的条件必须是真的)所以改变你的代码 在appPreferences.edit().putBoolean("first_run", true).apply(); clicklistener上添加此行buttonSave,然后在clicked = appPreferences.getBoolean("first_run", false);函数上添加此行appGetFirstTimeRun() 并且完整的代码将是。

appGetFirstTimeRun();
boolean clicked=false;

 buttonSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                int appCurrentBuildVersion = BuildConfig.VERSION_CODE;
                SharedPreferences appPreferences = getSharedPreferences("MyAPP", 0);
                appPreferences = appPreferences.edit().putBoolean("first_run",
                true).apply(); //***Add this ****
                appPreferences.edit().putInt("app_second_time",
                        appCurrentBuildVersion).apply();
                String name = editTextName.getText().toString();
                String pass = editTextPassword.getText().toString();
                String confirm = editTextConfirm.getText().toString();
                if ((editTextName.getText().toString().trim().length() == 0) || (editTextPassword.getText().toString().trim().length() == 0) || (editTextConfirm.getText().toString().trim().length() == 0)) {
                    Toast.makeText(getApplicationContext(), "Field cannot be null", Toast.LENGTH_LONG).show();
                } 
                else
                 {
                      insertData(name, pass, imageUri); // insert to SQLite
                      Intent intent = new Intent(MainActivity.this, AddMonthlyExpenses.class);
                      intent.putExtra("name", name);
                      startActivity(intent);
                  }
            }
        });

  private int appGetFirstTimeRun() {

        //Check if App Start First Time
        SharedPreferences appPreferences = getSharedPreferences("MyAPP", 0);
        int appCurrentBuildVersion = BuildConfig.VERSION_CODE;
        int appLastBuildVersion = appPreferences.getInt("app_first_time", 0);
        clicked = appPreferences.getBoolean("first_run", false); //*** Add this ***
        if (appLastBuildVersion == appCurrentBuildVersion && clicked) {
            Intent intent = new Intent(MainActivity.this,LoginPage.class);
            startActivity(intent);
            return 1;
        } else {
            appPreferences.edit().putInt("app_first_time",
                    appCurrentBuildVersion).apply();
            if (appLastBuildVersion == 0) {
                Toast.makeText(getApplicationContext(), "First time", Toast.LENGTH_SHORT).show();
                return 0; //es la primera vez
            } else {
                return 2; //es una versión nueva
            }
        }
    }

答案 7 :(得分:0)

尝试使用以下自定义getter和setter方法。

private static SharedPreferences getInstance(Context context) {
    context.getSharedPreferences("MY_APP", Context.MODE_PRIVATE);
    return sharedPreferences;
}

public boolean getAppStatus(Context context) {
    return getInstance(context).getString("FIRST_TIME", false);
}

public void setAppStatus(Context context, boolean status) {
    getInstance(context).edit().putString("FIRST_TIME", status).commit();
}

现在,当你第一次调用getAppStatus()或用户没有点击保存按钮时,甚至一次。它会返回false。您可以更新" FIRST_TIME"的值当用户单击“保存”按钮为true时变量。从而验证用户是否与注册页面进行了交互。

@Override
public void onClick(View v) {
    if(v.getId()==R.id.save_button)
     setAppStatus(context,true);
}

答案 8 :(得分:0)

custrecord_fieldid.custrecord_sp_ecom_description

检查" rstste"是false show register page else显示登录页面。