java - 在登录类的共享首选项中保存字符串以在 MainActivity 中使用 - 无法引用定义的非最终局部变量编辑器

标签 java android session android-intent

我已经构建了一个登录名,我希望我的应用程序将登录时使用的用户名存储为 session 名称,以便我可以根据登录者从数据库中提取信息。

登录工作正常,但是我第一次使用共享首选项将变量保存在 Login.java 中,然后我将在 MainActivity.java 中调用它> 运行 SQL 语句。

这是我的Login.java - 我首先尝试使用 Intent 来发送 boolean session 用户名,但我不能'不太了解 MainActivity 中已经存在的逻辑(onResume() 方法),因此我决定使用共享首选项,但收到错误 Cannot refer to the non-final local variable editor defined in an enclosing scope下划线 editor.在 if 语句中。

基本上:

1) 我应该使用我已经尝试实现的 Intent 来存储 session 名称和 boolean 值,还是使用共享首选项?如果是这样

2)如果答案是sharedpreferences,为什么它不让我使用editor.putStringeditor.apply();在 onClick 中?

请帮忙!有点头疼哈哈。

public class Login extends Activity   {
    DB db = new DB(this);
    boolean session = false;    
    int visited = 1;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login); 

        final EditText usernameET=(EditText)findViewById(R.id.usernameET);
        final EditText passwordET=(EditText)findViewById(R.id.passwordET);      
        final Button loginBTN=(Button)findViewById(R.id.loginBTN);
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = preferences.edit();

        loginBTN.setOnClickListener(new View.OnClickListener() {    

            @Override
            public void onClick(View v) {
                String username = usernameET.getText().toString();
                String password = passwordET.getText().toString();  
                boolean success = db.Login(username, password);       

                if(success)
                {
                    Log.d("login", "user logged");                  
                    session = true;                     
                    Intent i = new Intent(Login.this, MainActivity.class);
                    i.putExtra("loginSuccess", session);
                    i.putExtra("sessionName", username);                  
                    editor.putString("Name", username);
                    editor.apply();
                    startActivity(i);                   

                }
                else
                {
                    Log.d("login", "user not logged");
                }
            }

        });





    }

}

这是我的MainActivity.java

onResume()方法

此方法中的错误强调 getBooleanExtraThe method getBooleanExtra(String, boolean) in the type Intent is not applicable for the arguments (String)

protected void onResume() {
    super.onResume();
    final Intent intent = getIntent();
    if (intent.hasExtra("loginSuccess")) {
        boolean loginSuccess = intent.getBooleanExtra("loginSuccess");
        //Code goes here
    }
}

最佳答案

问题 1:方法 getBooleanExtra(String, boolean)类型 Intent不适用于参数(字符串)

getBooleanExtra的方法签名要求两个参数,但您只传递一个。第一个是键,第二个是默认值(如果未找到该键)。

改变

boolean loginSuccess = intent.getBooleanExtra("loginSuccess");

boolean loginSuccess = intent.getBooleanExtra("loginSuccess", false); // or true whichever you want as your default value

问题 2:无法引用封闭范围内定义的非最终局部变量编辑器

只需输入 final username之前的标识符

final String username = usernameET.getText().toString();

Should I use the intents I have already tried to implement to store a session name and boolean, or do I use sharedpreferences?

我会使用SharedPreference因为它不会强制我通过 Intent 向每个需要 session 信息的 Activity 发送数据。我将能够在任何地方获得它,而无需付出任何额外的努力(每次向每个 Activity 发送数据)

关于java - 在登录类的共享首选项中保存字符串以在 MainActivity 中使用 - 无法引用定义的非最终局部变量编辑器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35539607/

相关文章:

java - 从 json 响应创建 java 模型

java - Android获取谷歌地图的最后已知位置

java - 创建一个自定义的Facebook登录RelativeLayout和这个布局的Onclick,调用facebook登录api?

Android WebView 但没有其他组件

javascript - 简单且通用的客户端持久性解决方案?

php - 查找打开 session 数

java - 如何模拟真正的外部 sd(更新 : removable storage) card in Android Emulator

android - 如何在 Smack 中启用 XEP-0199?

android - OnGroupClickListener

javascript - nodejs 快速登录失败