2012-04-12 47 views
0

请看看下面的代码... 我正在创建一个上下文菜单并实现方法onContextItemSelected但问题是,当我按下回复项...删除对话框情况也出现和活动也开始两次......意味着所有的情况下,执行...在删除回复和转发的情况下...会发生什么是问题,请帮助上下文菜单不能正常工作

@Override 
    public boolean onContextItemSelected(MenuItem item) { 
     // TODO Auto-generated method stub 
     AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
     switch(item.getItemId()) 
     { 
    case R.id.reply: 
    { 
      Intent i = new Intent(); 
      String s2 = (String) ((Cursor) getListView().getItemAtPosition(info.position)) 
        .getString(2); 
      i.putExtra("number", s2); 
     // Log.v("number", s2); 
      i.setClass(this, CreateMessage.class); 
      // i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(i); 

    } 
     case R.id.delete: 
     { 

     final String s = (String) ((Cursor) getListView().getItemAtPosition(info.position)) 
         .getString(1); 

       dba = new DBAdapter(this); 

       AlertDialog.Builder builder = new AlertDialog.Builder(this); 
       builder.setMessage("Are you sure you want to delete?") 
         .setCancelable(false) 
         .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
          // Log.v("", "You Clicked " + s);    


          dba.delete("messages", "id=?", new String[] { s }); 
          populate(); 
          dba.close(); 
          } 
         }) 
         .setNegativeButton("No", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           dialog.cancel(); 
          } 
         }); 
       AlertDialog alert = builder.create(); 
       alert.show(); 
     } 

     case R.id.forward: 
     { 
      Intent i = new Intent(); 
      String s3 = (String) ((Cursor) getListView().getItemAtPosition(info.position)) 
        .getString(4); 
     // Log.v("message", s3); 
      i.putExtra("message", s3); 
      i.setClass(this, CreateMessage.class); 
      startActivity(i); 
     } 
default: 

     return super.onContextItemSelected(item); 
     } 
    } 

这里是在logcat中显示的logcat错误...

03-30 09:13:28.439: E/WindowManager(2273): Activity sms.app.Displayer has leaked window [email protected] that was originally added here 

sms.app.Displayer是在我在执行上下文菜单中的类..

,这里是上下文菜单文件的代码..

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 


    <item android:id="@+id/reply" android:title="Reply"></item><item 
     android:id="@+id/forward" 
     android:title="Forward"> 
    </item> 
    <item android:id="@+id/delete" android:title="Delete Message"> 
    </item> 

</menu> 

回答

0

一旦检查这个代码的微小变化在你onContextItemSelected方法::

@Override 
    public boolean onContextItemSelected(MenuItem item) { 
     // TODO Auto-generated method stub 
     AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
     switch(item.getItemId()){ 
     case R.id.reply: 
      Intent i = new Intent(); 
      String s2 = (String) ((Cursor) getListView().getItemAtPosition(info.position)) 
        .getString(2); 
      i.putExtra("number", s2); 
      // Log.v("number", s2); 
      i.setClass(this, CreateMessage.class); 
      // i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(i); 
      break; 
     case R.id.delete: 

      final String s = (String) ((Cursor) getListView().getItemAtPosition(info.position)) 
        .getString(1); 

      dba = new DBAdapter(this); 

      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setMessage("Are you sure you want to delete?") 
      .setCancelable(false) 
      .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // Log.v("", "You Clicked " + s);    


        dba.delete("messages", "id=?", new String[] { s }); 
        populate(); 
        dba.close(); 
       } 
      }) 
      .setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 
     break; 

     case R.id.forward: 
      Intent i = new Intent(); 
      String s3 = (String) ((Cursor) getListView().getItemAtPosition(info.position)) 
        .getString(4); 
      // Log.v("message", s3); 
      i.putExtra("message", s3); 
      i.setClass(this, CreateMessage.class); 
      startActivity(i); 
     break; 
     } 
     return true; 
    } 
+0

是这是正确的,但返回真正的声明应该在外部范围....不是在break语句后 – kashifmehmood 2012-04-12 09:42:29

+0

编辑我的答案根据需要/建议 – 2012-04-12 09:52:42

1

你的case语句

后加上休息

编辑: 由于缺少中断,因此您可能会遇到以下情况。或者给你的case语句添加中断(以后再处理返回值)或者直接添加返回true而不是中断。

+0

休息时间给出了一个错误,该方法必须返回一个boolean – kashifmehmood 2012-04-12 09:22:21

+0

再加入真正的回报,而不是断裂 – 2012-04-12 09:23:15

+0

同样的错误,如果我添加返回true to all cases – kashifmehmood 2012-04-12 09:25:59