Как заставить приложение перейти на другую страницу, если он не запускается в первый раз
У меня есть RegisterPage
и LoginPage
. Когда приложение будет запущено, оно проверяет, запускается ли приложение в первый раз или нет в 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.
Ответы
Ответ 1
Отметьте кнопку щелчка после вставки данных в 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
}
}
}
}
Ответ 2
вы зависите от SharedPreferences
, а также от переменной clicked
, вы можете зависеть от SharePreferences
, но не от переменной, потому что при каждом запуске вы устанавливаете значение click для 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);
Ответ 3
Вам также необходимо изменить значение общих настроек при нажатии кнопки сохранения. Тогда только в следующий раз при открытии приложения appGetFirstTimeRun метод загрузит страницу входа.
В вашем btnSave клик слушателя, где вы начинаете замысел активности непосредственно перед startActivity, добавьте этот код
int appCurrentBuildVersion = BuildConfig.VERSION_CODE;
SharedPreferences appPreferences = getSharedPreferences("MyAPP", 0);
appPreferences.edit().putInt("app_first_time",
appCurrentBuildVersion).apply();
Ответ 4
в start метода 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.
Вы можете получить класс Prefs из этого проекта
Ответ 5
добавьте этот код в свой заставку
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
Ответ 6
вы используете переменную клика, чтобы определить, нажата ли кнопка или нет, но когда вы существуете из приложения, а затем нажмите значение reset на значение false, вместо того, чтобы сохранять значение в переменной клика, вы можете использовать общие предпочтения для сохранения значения true или false при нажатии кнопки и получения значения из общего предпочтения для проверки
при нажатии кнопки сохранения
appPreferences.edit().putInt("app_second_time",
appCurrentBuildVersion).apply();
Ответ 7
Я думаю, что это может быть ответ. на ваш код clicked boolean
переменная не сохраняется в общих настройках, но вы проверяете условие внутри appGetFirstTimeRun() (кнопка не может быть нажата при втором запуске, но ваше условие должно быть правдой), поэтому измените свой код на
Добавьте эту строку appPreferences.edit().putBoolean("first_run", true).apply();
в buttonSave
clicklistener, а затем добавьте эту строку 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
}
}
}
Ответ 8
Попробуйте использовать следующие пользовательские методы 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);
}
Ответ 9
//Use shared preference to save.
SharedPreferences preferedName=getSharedPreferences("firstrun", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = preferedName.edit();
editor.putboolean("firstrun",value);
editor.apply();
editor.commit();
//and to retrive.
SharedPreferences preferedName=getSharedPreferences("firstrun", Activity.MODE_PRIVATE);
boolean rstate =preferedName.getString("firstrun",false);
проверьте, является ли "rstste" ложной страницей на странице регистрации, показывая страницу входа.