【问题标题】:How to disable button in another activity?如何禁用另一个活动中的按钮?
【发布时间】:2013-04-06 14:06:58
【问题描述】:

我有一个游戏活动,当它结束时它会进入主菜单,现在我需要禁用启动刚刚结束的游戏的按钮。让我们称我的游戏类为 classGame 和我的菜单 classMenu。我试过了:

在我的课堂游戏中:

classMenu obj = new classMenu();

然后在合适的时候在同一个班级我打电话:

obj.myButtonToBeDisabled.setEnabled(false);

但是一旦我的菜单活动开始,我在创建我的 obj 的地方就收到了 stactOverflow 错误。如何做到这一点?

编辑: 我也在我的游戏类中尝试过这个:

public void disableButton(){
        button.setEnabled(false);
    }

然后调用它:

obj.disableButton

但同样的错误。

LogCat:

04-06 16:30:48.709: I/dalvikvm(25015): threadid=1: stack overflow on call to Ljava/lang/VMThread;.currentThread:L
04-06 16:30:48.709: I/dalvikvm(25015):   method requires 0+20+0=20 bytes, fp is 0x4214d300 (0 left)
04-06 16:30:48.709: I/dalvikvm(25015):   expanding stack end (0x4214d300 to 0x4214d000)
04-06 16:30:48.769: I/dalvikvm(25015): Shrank stack (to 0x4214d300, curFrame is 0x4214fcb0)
04-06 16:30:48.899: D/AndroidRuntime(25015): Shutting down VM
04-06 16:30:48.899: W/dalvikvm(25015): threadid=1: thread exiting with uncaught exception (group=0x40018560)
04-06 16:30:49.369: D/dalvikvm(25015): GC_CONCURRENT freed 325K, 50% free 2850K/5639K, external 0K/0K, paused 5ms+24ms
04-06 16:30:49.459: E/AndroidRuntime(25015): FATAL EXCEPTION: main
04-06 16:30:49.459: E/AndroidRuntime(25015): java.lang.StackOverflowError
04-06 16:30:49.459: E/AndroidRuntime(25015):    at java.lang.Thread.currentThread(Thread.)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at java.lang.ThreadLocal.get(ThreadLocal.java:59)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at android.os.Looper.myLooper(Looper.)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at android.os.Handler.<init>(Handler.)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at android.app.Activity.<init>(Activity.)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:17)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Izbor.<init>(Izbor.java:19)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.androidaplikacije.toplo_hladno.Asocijacije.<init>(Asocijacije.java:32)
04-06 16:30:49.459: E/AndroidRuntime(25015):    at rs.android
04-06 16:30:49.659: D/dalvikvm(25015): GC_CONCURRENT freed 522K, 51% free 2899K/5895K, external 0K/0K, paused 7ms+5ms

Asocijacije 是我的 gameClass,而 Izbor 在我的 menuClass 中。

【问题讨论】:

  • 您能否在开始游戏之前禁用按钮(即,一旦单击它?)。要么使用 startActivityForResult developer.android.com/reference/android/app/… 在活动结束时获取回调?
  • 其实我不太明白你描述的错误...如果你有堆栈溢出,寻找一个循环函数调用 - 即函数A调用函数B,它调用函数A(A和B 也可以在不同的类别中)。
  • 如果您只想让用户无法点击它并且它不会出现,请使用button.setVisible(false);
  • 不,我需要它是可见的,我只需要被禁用。即使我需要你所说的,它也是一样的方法 setEnabled(false);我尝试过并得到错误,所以我想我的代码也会出错。

标签: java android


【解决方案1】:

您无需在游戏中调用任何内容。如果您的菜单是首先启动游戏的菜单,那么当游戏的Activity 结束时,它会收到通知。

使用startActivityForResult 开始您的游戏,如下所示:

Intent intent = new Intent ();
intent.setClassName ("com.your.package.name", "com.your.package.name.YourGameActivity");
startActivityForResult (intent, 0);

然后,在你的游戏类中,当你的游戏结束时,在你 finish 你的游戏 Activity 之前调用 setResult (int result),如下所示:

setResult (123);   // or something like Menu.GAME1_FINISHED
finish ();

回到您的 Menu Activity,您必须像这样实现 onActivityResult 回调:

public void onActivityResult (int requestCode, int resultCode, Intent intent) {
    super.onActivityResult (requestCode, resultCode, intent);

    switch (resultCode)
    case 123:
        // hide button 1
    case 234:
        // hide button 2
    // etc...
}

【讨论】:

  • 谢谢好人!那行得通。可以看看this吗?
  • 但是如何禁用 Listview 中的按钮 @Shade ?任何信息都会有很大帮助!
【解决方案2】:

你可以试试.setClickable(false),看看我问的关于它们之间区别的问题:

setEnabled() vs setClickable(), what is the difference?

如果没有错误日志,我们无法为您提供更多帮助,请发布它们。

【讨论】:

  • 您能否发布您的完整课程代码,我认为您的错误并非源自此操作。
  • 这是相当大的一类。在这里你可以在我的 github 上看到它。游戏类是 Asocijacije.java,菜单类是 Izbor.java。我试图禁用的按钮是 asocijacije。 link
【解决方案3】:

我相信您在调用代码以禁用按钮的方法方面遇到问题,告诉菜单类禁用按钮的安全方法可以通过 LocalBroadcastManager,如 here 所述。

基本上,您可以将菜单对象注册为在游戏结束时发送的特定广播消息的侦听器,该消息将执行禁用所需按钮的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多