kashifmehmood
kashifmehmood

Reputation: 127

context menu not working properly

please have a look at the code below... i am creating a context menu and implementing the method onContextItemSelected but the problem is that when i press the reply item...the dialog on the delete case also appears and the activity also starts twice...means all the cases executes...the delete the reply and the forward case...what happens to be the problem please help

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

and here is the error from the logcat that is displayed in the logcat...

03-30 09:13:28.439: E/WindowManager(2273): Activity sms.app.Displayer has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44eb95c8 that was originally added here

sms.app.Displayer is the class in which i am implementing the context menu..

and here is the code of the context menu file..

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

Upvotes: 0

Views: 326

Answers (2)

Shankar Agarwal
Shankar Agarwal

Reputation: 34765

Once check this code a minor change in your onContextItemSelected method::

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

Upvotes: 0

ct_rob
ct_rob

Reputation: 521

add breaks after your case statements

Edit: You fall thru to the following case blocks because you are missing the breaks. Either add breaks to you case statements (and handle the return value later) or directly add return true instead of the breaks.

Upvotes: 1

Related Questions