当我长时间点击GridView中的项目时,如何在Android应用程序上显示Dialog?

时间:2011-07-06 18:42:58

标签: java android gridview onlongclicklistener

当我长按GridView中的某个项目时,我正在尝试显示一个Dialog。我试过这个,但它错了。我真的不明白如何使用OnItemLongClickListener以及为什么它返回一个布尔值。有人可以帮我理解这一点,并弄清楚如何显示这个对话框。

 gridView.setOnItemLongClickListener(new OnItemLongClickListener() {
        public boolean onItemLongClick(AdapterView<?> parent, View v,
          int position, long id) {
             FavoriteViewDialog dialog = 
                     new FavoriteViewDialog(FavoriteView.this, null, null);         
            dialog.show();
            return true;
        }
 });

谢谢。

它抛出的错误是......

Thread [<1> main] (Suspended (exception WindowManager$BadTokenException))   
FavoriteViewDialog(Dialog).show() line: 245 
FavoriteView$2.onItemLongClick(AdapterView, View, int, long) line: 39   
GridView(AbsListView).performLongPress(View, int, long) line: 1753  
AbsListView.access$600(AbsListView, View, int, long) line: 72   
AbsListView$CheckForLongPress.run() line: 1711  
ViewRoot(Handler).handleCallback(Message) line: 587 
ViewRoot(Handler).dispatchMessage(Message) line: 92 
Looper.loop() line: 123 
ActivityThread.main(String[]) line: 4627    
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
Method.invoke(Object, Object...) line: 521  
ZygoteInit$MethodAndArgsCaller.run() line: 868  
ZygoteInit.main(String[]) line: 626 
NativeStart.main(String[]) line: not available [native method]  

2 个答案:

答案 0 :(得分:0)

尝试使用Activity的showDialog(int i)方法来显示对话框:http://developer.android.com/guide/topics/ui/dialogs.html

定义onCreateDialog(int)和onPrepareDialog(int,Dialog)回调方法的最佳方法是使用switch语句检查传入方法的id参数...

static final int DIALOG_PAUSED_ID = 0;
static final int DIALOG_GAMEOVER_ID = 1;

然后,使用每个ID的switch case定义onCreateDialog(int)回调:

protected Dialog onCreateDialog(int id) {
    Dialog dialog;
    switch(id) {
    case DIALOG_PAUSED_ID:
        // do the work to define the pause Dialog
        break;
    case DIALOG_GAMEOVER_ID:
        // do the work to define the game over Dialog
        break;
    default:
        dialog = null;
    }
    return dialog;
}

注意:在此示例中,case语句中没有代码,因为定义Dialog的过程超出了本节的范围。请参阅下面有关创建AlertDialog的部分,提供适用于此示例的代码。

然后拨打showDialog(DIALOG_PAUSED_ID); //or another int representing a Dialog.

答案 1 :(得分:0)

通常,WindowManager $ BadTokenException与上下文相关。

通常,当您使用一个上下文在另一个上下文中显示对话框时会抛出它。

通常可以通过在对话框中使用getApplicationContext而不是SomeActivity来避免这种情况。这是