【问题标题】:How to call methods in onCreate (when the app starts)如何在 onCreate 中调用方法(应用启动时)
【发布时间】:2016-02-29 16:37:02
【问题描述】:

我有 MainActivity.class 有一些方法。 这是我想在应用启动时调用的方法:

public void loadGame(View view) {
    SharedPreferences loadGame = getSharedPreferences(PREFS, MODE_PRIVATE);         
    cashView.setText("cash: " + String.valueOf(cash));
    levelView.setText("level: " + String.valueOf(level));
}

所以我尝试在我的 onCreate 方法中输入以下内容:

loadGame();

但是我得到一个错误: (View) 中的 MainActivity 不能应用于 ()

很抱歉提出这么愚蠢的问题,但我不明白。 我认为 onCreate 和其他活动方法类似于 Java 中的 main 方法(但它们不是),但我仍然可以轻松地为 Button onClick 分配一个方法。为什么应用启动时不能调用方法?有什么解决办法吗?

更新:MainActivity 代码:

public class MainActivity extends AppCompatActivity {
    private int cash = 1000;
    private int level = 1;
    private TextView cashView;
    private TextView levelView;

    public static final String PREFS = "MySavedGameFile";

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

     //the compiler says it cannot resolve symbol 'view'
     //  loadGame(view);
     //I need to call the method anyway
        cashView = (TextView) findViewById(R.id.cashView);
        levelView = (TextView) findViewById(R.id.levelView);

    }
     public void loadGame(View view) {
        SharedPreferences loadGame = getSharedPreferences(PREFS, MODE_PRIVATE);
        cash = loadGame.getInt("savedCash", 1000);
        level = loadGame.getInt("savedLevel", 1);
        cashView.setText("Cash: " + String.valueOf(cash));
        levelView.setText("Level: " + String.valueOf(level));

【问题讨论】:

  • 可以在onCreate中调用方法,能否贴出完整的onCreate方法
  • 很好奇为什么你需要为这个方法传递视图?删除参数,只调用不带参数的函数。
  • 而不是 public void loadGame(View view) put public void loadGame()
  • 发布您的错误堆栈跟踪。
  • 发布你的错误堆栈跟踪。显然没有堆栈跟踪......这是一个编译时错误

标签: java android android-studio methods oncreate


【解决方案1】:

您的代码的问题是您正在定义一个带有签名的方法,但使用另一个方法来调用它..

如果你定义了一个方法public void loadGame(View view) 那么你需要像loadGame(view)一样称呼它

如果您执行loadGame(); 之类的操作,那么编译器会发疯,因为他找不到该方法(没有参数的方法...)

快速修复:

replace 将视图(无论是什么)添加到方法调用中

更新:

你可以替换方法public void loadGame(View view) { 对于这个public void loadGame( ) {,因为您没有在该方法中使用任何视图,并且在 oncreate 中没有声明任何视图(除了控件 cashView 和 levelView 但这些是 Activity 字段...)。


您的最终代码应如下所示:

 ...
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        cashView = (TextView) findViewById(R.id.cashView);
        levelView = (TextView) findViewById(R.id.levelView);
        loadGame( );

    }
     public void loadGame() {
        SharedPreferences loadGame = getSharedPreferences(PREFS, MODE_PRIVATE);
        cash = loadGame.getInt("savedCash", 1000);
        level = loadGame.getInt("savedLevel", 1);
        cashView.setText("Cash: " + String.valueOf(cash));
        levelView.setText("Level: " + String.valueOf(level));
      }

【讨论】:

  • Hm.. 即使在那种情况下它说“无法解析符号'view'”我这样调用方法:loadGame(view);
  • 完美,我看到了更新,我也修改了我的答案...只需删除方法中的视图...
  • 不幸的是,需要该视图。没有它,应用程序会崩溃,因为它无法识别 TextView 来设置文本。因此,如果没有它,应用程序会崩溃,但有了它,编译器就会变得疯狂
  • 没有@NikolayS。只需移动 loadGame();就在你的 Textview 和 editText 指令之后,否则你会得到一个空指针异常
  • 我在答案末尾添加了一个新代码...这行得通!
【解决方案2】:

您需要将 View 对象作为参数传递给 loadGame() 方法。考虑到您没有在方法中使用view,您可以将其作为参数移除,或者创建一个不带参数的同名新方法。

【讨论】:

    猜你喜欢
    • 2011-10-17
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多