【问题标题】:How can I set sharedPreferences data to a textview?如何将 sharedPreferences 数据设置为文本视图?
【发布时间】:2019-05-21 19:04:54
【问题描述】:

我在 android studio 中有一个设置活动,用户将在文本框中输入名称。他们将单击保存并转到另一个活动,他们的名字将显示在文本视图中。我在尝试让名称显示在 textview 中时遇到了麻烦,我尝试了一些不同的事情并且得到了一些不同的错误,这可能是我没有得到或忽略的简单事情。这是我的错误+代码

public class ActivityDuel extends AppCompatActivity {


public static String getPrefs(String n, Context context) {
    final TextView txtD1 = (TextView) getView().findViewById(R.id.txtD1);
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(n, "name");
    txtD1.setText(n);

}

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



}

}

我的错误是:

error: non-static method <T>findViewById(int) cannot be referenced from a static context
where T is a type-variable:
T extends View declared in method <T>findViewById(int)

【问题讨论】:

标签: java android sharedpreferences


【解决方案1】:

删除静态关键字并返回您保存的字符串

public String getPrefs(String n, Context context) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(n, "name");
}

在您的 OnCreate 上

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

    final TextView txtD1 = (TextView) findViewById(R.id.txtD1);
    txtD1.setText(getPrefs("your_key", this));

}

【讨论】:

  • 谢谢,但它只返回默认值返回首选项.getString(n, "name");由于某种原因,现在在文本视图中
  • 您是否在 SharedPreferences 中保存了任何字符串?如果您确实使用了保存时使用的密钥。并在 onCreate 中替换为“your_key”
【解决方案2】:

只想添加到其他答案以解释为什么这不起作用 - 问题是您在 getPrefs 方法上使用了 static 关键字。

由于getPrefs是一个静态方法,它属于ActivityDuel,而不是ActivityDuel实例。所以它不能引用你的 TextView,因为那是活动实例的一部分。

Here's a good explanation of statics in java

【讨论】:

    【解决方案3】:

    尝试以这种方式实现它:

    public class ActivityDuel extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_duel);
        Toolbar toolbar = findViewById(R.id.toolbar);
        TextView txtD1 = (TextView) findViewById(R.id.txtD1);
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        String string = preferences.getString(n, "name");
        setSupportActionBar(toolbar);
    
        txtD1.setText(string);
    
    
    
    
      }  
    }
    

    【讨论】:

      【解决方案4】:

      假设您在 Activity 中有一个静态 Fragment 内部类:您尝试调用 Activity 的 findViewById(),而在不包含对父级引用的静态内部类中却不能这样做。

      在 onCreateView() 中,您需要在刚刚膨胀的根视图上调用它。

      你可以试试这个。

      public class ActivityDuel extends AppCompatActivity {
      
      
      public String getPrefs(String n, Context context) {
          final  TextView txtD1 = (TextView) rootView.findViewById(R.id.txtD1);
          SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
          return preferences.getString(n, "name");
          txtD1.setText(n);
      
      }
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_duel);
          Toolbar toolbar = findViewById(R.id.toolbar);
          setSupportActionBar(toolbar);
      
      
      
      }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多