2012-04-12 22 views
0

Bitte schauen Sie sich den Code unten an ... ich erstelle ein Kontextmenü und implementiere die Methode onContextItemSelected aber das Problem ist, dass wenn ich das Antwortobjekt drücke ... den Dialog zum Löschen Fall erscheint auch, und die Aktivität startet auch zweimal ... die Gesamtheit aller Fälle führt ... die die Antwort und die vorwärts-Fall löschen ..., was das Problem bitte helfenKontextmenü funktioniert nicht richtig

@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); 
     } 
    } 

und hier zu sein passiert, ist die Fehler von der Logcat, die in der Logcat angezeigt wird ...

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 ist die Klasse, in der ich das Kontextmenü bin die Umsetzung ..

und hier ist der Code im Kontextmenü Datei ..

<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> 

Antwort

0

einmal überprüfen diesen Code eine kleine Änderung in Ihrem onContextItemSelected Methode ::

@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

ja das ist richtig, aber die Rückkehr wahre Aussage sollte im äußeren Bereich sein .... nicht nach der Pause-Anweisung – kashifmehmood

+0

oh meine Antwort bearbeitet wie benötigt/vorgeschlagen –

1

hinzufügen Pausen nach dem Fall Aussagen

Bearbeiten: Sie fallen durch die folgenden Fall Blöcke, weil Sie die Pausen fehlen. Fügen Sie Ihren case-Anweisungen Pausen hinzu (und behandeln Sie den Rückgabewert später) oder fügen Sie direkt true anstelle der Pausen hinzu.

+0

den Pausen gibt einen Fehler, dass die Methode Rückkehr ein boolean – kashifmehmood

+0

fügen Sie dann zurückgeben muss wahr statt der Pausen –

+0

gleichen Fehler, wenn ich hinzufügen Rückkehr zu allen Fällen – kashifmehmood