【问题标题】:Android, why I cant call my stringarray inside a method outside of onCreate?Android,为什么我不能在 onCreate 之外的方法中调用我的字符串数组?
【发布时间】:2018-10-16 17:37:54
【问题描述】:

在我的 onCreate 方法之外,我的 stringarray 无法被调用,这是为什么呢?

我尝试在 onCreate 外部的方法中使用 getResources() 再次初始化字符串数组;但我也不能这样称呼, 我猜我缺乏一些基础知识,因为我在编程世界中相当新,你能帮我或解释为什么不能在 onCreate 之外调用字符串数组和/或如何解决它吗?

onCreate 中的示例:

final String[] list = res.getStringArray(R.array.fact);

在 onCreate 之外:

public void facts(){
   getResources();
final String[] list = res.getStringArray(R.array.fact);

}// marked res. in red saying "qualifier must be an expression" and without that I cant call "list"..

【问题讨论】:

  • 如果不共享代码,您如何期望得到合理的答案?
  • 我认为这个问题不需要我的代码,因为它更像是一个一般性问题

标签: java android arrays oop oncreate


【解决方案1】:

我相信您的问题是可变范围。您已经在 onCreate() 方法中声明了您的字符串数组,并为其提供了“方法范围”,然后您正试图在另一个方法中访问它。我建议将您的字符串数组声明为类级变量,以便您可以从该类中的任何方法访问它。

为避免 Ben P. 在评论中指出的 NullPointerException 问题,您可以在 onResume() 方法中初始化数组变量,以便在需要在其他任何地方使用它之前准备好它。

请务必查看代码示例下方的参考链接。我认为他们会比我在这里的快速回答中更好地解释“为什么”。

public class MainActivity extends AppCompatActivity {

    private static String[] list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onResume() {
        super.onResume();

        // onResume() runs after onCreate() and onStart() in the Android Activity lifecycle.
        // If your array has not been initialized yet, do it now.
        if (list == null || list.length == 0) {
            list = getResources().getStringArray(R.array.fact);
        }
    }

    public void facts() {
        // Do something with your array...
        for (String arrayItem : list) {
            String fact = arrayItem.toUpperCase();
        }
    }

}

参考资料:

【讨论】:

    【解决方案2】:

    替换

    final String[] list = res.getStringArray(R.array.fact); 
    

    final String[] list = getResources().getStringArray(R.array.fact); 
    

    【讨论】:

    • 不要对类级字段执行此操作。 getResources() 直到 onCreate() 执行后才返回有效的 Resources 对象,因此此代码将抛出 NullPointerException。在onCreate() 之后执行的其他方法中执行此操作很好。
    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多