【问题标题】:SharedPreferences used to display text, not showingSharedPreferences 用于显示文本,不显示
【发布时间】:2019-02-09 14:23:28
【问题描述】:

我正在尝试在导航抽屉中设置用户文本。对于两个值名称和课程,我从数据库类调用字符串方法并将其存储在字符串中。其他两个值 id 和 email 我从用户那里获取并存储它。我使用 SharedPreferences 来传递值。然后在 onCreate 内的导航活动中,我获取值然后将其设置为适当的文本视图。但什么也没有出现。注册后它仍然是空的。我在这里做错了什么?

我还应该提到,我在注册后不会开始导航活动。它是注册->登录->仪表板->导航。所以这是我将值传递给的第四个活动。 我使用了 Google 提供的 Navigation 活动,并在 onCreate 中创建了 settext,但仍然没有得到想要的输出。

导航:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_navigation);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        txtName = (TextView) findViewById(R.id.n);
        txtsid = (TextView) findViewById(R.id.s);
        txtcourse = (TextView) findViewById(R.id.c);
        txtemail = (TextView) findViewById(R.id.e);

        SharedPreferences myPrefs = getSharedPreferences("myPrefs", MODE_PRIVATE);

            String name = myPrefs.getString("name", "null");
            String course = myPrefs.getString("course", "null");
            String sid = myPrefs.getString("sid", "null");
            String email = myPrefs.getString("email", "null");

            if (myPrefs.contains("name")) txtName.setText(name);
            if (myPrefs.contains("course")) txtcourse.setText(course);
            if (myPrefs.contains("sid")) txtsid.setText(sid);
            if (myPrefs.contains("email")) txtemail.setText(email);


    }

注册:

buttonRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (validate()) {
                    String Email = editTextEmail.getText().toString();
                    String SID = editTextSID.getText().toString();
                    String Password = editTextPassword.getText().toString();
                    progressBar.setVisibility(View.VISIBLE);

                    //Check in the database is there any user associated with  this email

                    if (!sqliteHelper.ifUserRegistered(SID) && sqliteHelper.ifUserExists(SID) && !sqliteHelper.isEmailExists(Email)) {

                        sqliteHelper.registerUser(new User(null, Email, SID, Password));
                        Snackbar.make(buttonRegister, "User created successfully! Please Login ", Snackbar.LENGTH_LONG).show();

                        String name = sqliteHelper.getUserNameFromSID(SID);
                        String course = sqliteHelper.getUserCourseFromSID(SID);
                        SharedPreferences myPrefs = getSharedPreferences("SharedPref", MODE_PRIVATE);
                        SharedPreferences.Editor editor = myPrefs.edit();
                        editor.putString("name", name);
                        editor.putString("course", course);
                        editor.putString("sid", SID);
                        editor.putString("email", Email);
                        editor.commit();

                        new Handler().postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                finish();
                            }
                        }, Snackbar.LENGTH_LONG);

我的文本视图在 nav_header.xml 下,只有布局高度和宽度属性,这包含在 headerlayout 属性下的主 navigation.xml 中。

【问题讨论】:

    标签: android textview android-sqlite sharedpreferences settext


    【解决方案1】:

    您的问题是由不正确的文件名引起的。

    在您的Register 中,您使用了getSharedPreferences("SharedPref", MODE_PRIVATE); 基本上,您的SharedPreference 文件名为SharedPref

    但是,在 导航 中,您使用了getSharedPreferences("myPrefs", MODE_PRIVATE); 基本上,您获取的是名为 myPrefs 的 SharedPreference 文件。

    因此,您只是保存到一个文件,但试图从另一个文件中获取该数据。

    因此,在您的导航中,当您以这种方式编码您的setText() 时:

    if (myPrefs.contains("name")) txtName.setText(name);
    if (myPrefs.contains("course")) txtcourse.setText(course);
    if (myPrefs.contains("sid")) txtsid.setText(sid);
    if (myPrefs.contains("email")) txtemail.setText(email);
    

    myPrefs 文件不可能包含这些名称,因此它总是无法通过检查,并且永远不会调用 setText()

    所以解决这个问题的方法就是使用相同的文件名。

    导航中替换:

    SharedPreferences myPrefs = getSharedPreferences("myPrefs", MODE_PRIVATE);
    

    与:

    SharedPreferences myPrefs = getSharedPreferences("SharedPref", MODE_PRIVATE);
    

    【讨论】:

      【解决方案2】:

      尝试替换您的代码,

      txtName = (TextView) findViewById(R.id.n);
              txtsid = (TextView) findViewById(R.id.s);
              txtcourse = (TextView) findViewById(R.id.c);
              txtemail = (TextView) findViewById(R.id.e);
      

      NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
      View headerView = navigationView.getHeaderView(0); 
      txtName  = (TextView)  headerView.findViewById(R.id.n);
      txtsid = (TextView) headerView.findViewById(R.id.s);
      txtcourse = (TextView) headerView.findViewById(R.id.c);
      txtemail = (TextView) headerView.findViewById(R.id.e);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-08
        • 2021-12-17
        • 2014-11-16
        • 2012-07-24
        • 2014-02-26
        • 2019-03-27
        • 2017-04-24
        • 2019-02-05
        相关资源
        最近更新 更多