android-onOptionsItemSelected方法调用两次

时间:2013-10-24 11:38:35

标签: java android

我已根据this问题的接受答案指导ActionBarSherlock SupportMapFragment。一切都很好。但唯一的问题是onOptionsItemSelected方法被调用两次。这是代码 -

@Override
public boolean onOptionsItemSelected(
        com.actionbarsherlock.view.MenuItem item) {
    switch (item.getItemId()) {
 case R.id.navigation:
 Log.d("tag","text");
 break;
 }
 return super.onOptionsItemSelected(item);
}

编辑 -

这是我的整个FragmentMaps课程:

package com.vishalaksh.technex;

import android.database.Cursor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.SubMenu;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.CancelableCallback;
import com.google.android.gms.maps.UiSettings;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.vishalaksh.technex.db.DatabaseHelper;
import com.vishalaksh.technex.db.DbConstants;
import com.vishalaksh.technex.utils.Constants;
import com.vishalaksh.technex.utils.JSONconstants;
import com.vishalaksh.technex.utils.MapConstants;
import com.vishalaksh.technex.utils.SherlockMapFragment;

public class FragmentMaps extends SherlockMapFragment implements MapConstants,
        Constants, DbConstants, JSONconstants {

private GoogleMap mMap;
private static final int VIEW = 0;
DatabaseHelper db;

public FragmentMaps() {
    super();

}

public static FragmentMaps newInstance() {
    FragmentMaps frag = new FragmentMaps();

    return frag;
}

@Override
public View onCreateView(LayoutInflater arg0, ViewGroup arg1, Bundle arg2) {
    View v = super.onCreateView(arg0, arg1, arg2);

    db = new DatabaseHelper(getActivity());

    setUpMapIfNeeded();
    return v;
}

public void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the
    // map.
    if (mMap == null) {
        // Try to obtain the map from the SupportMapFragment.
        mMap = getMap();
        // Check if we were successful in obtaining the map.
        if (mMap != null) {
            setUpMap();
        }
    }
}

private void setUpMap() {
    UiSettings settings = mMap.getUiSettings();
    settings.setAllGesturesEnabled(true);
    settings.setMyLocationButtonEnabled(true);
    mMap.setMyLocationEnabled(true);
    mMap.moveCamera(CameraUpdateFactory.newCameraPosition(BHU_position));

    GoToIITBHU();

    /*
     * the following block shifted to onresume() if
     * (getActivity().getComponentName().getClassName()
     * .equalsIgnoreCase(Activity_msg_map.class.getName())) { //
     * Activity_msg_map setupMsgMap(); } else { // activity main
     * setupMain(); setHasOptionsMenu(true); }
     */

}

@Override
public void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    if (mMap != null) {
        if (getActivity().getComponentName().getClassName()
                .equalsIgnoreCase(Activity_msg_map.class.getName())) {
            // Activity_msg_map
            setupMsgMap();
        } else {
            // activity main
            setupMain();
            setHasOptionsMenu(true);
        }
    }

}

private boolean checkReady() {
    if (mMap == null) {
        Toast.makeText(getActivity(), R.string.map_not_ready,
                Toast.LENGTH_SHORT).show();
        return false;
    }
    return true;
}

@Override
public void onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu,
        com.actionbarsherlock.view.MenuInflater inflater) {
    // menu.add(VIEW, VIEW_PLACES_MENU_ITEM, 0,
    // "View Places").setShowAsAction(
    // MenuItem.SHOW_AS_ACTION_ALWAYS|MenuItem.SHOW_AS_ACTION_WITH_TEXT);
    // menu.add(VIEW, VIEW_EVENTS_MENU_ITEM, 0,
    // "View Events").setShowAsAction(
    // MenuItem.SHOW_AS_ACTION_ALWAYS|MenuItem.SHOW_AS_ACTION_WITH_TEXT);
    menu.clear();

    SubMenu optionsMenu = menu.addSubMenu("View");

    optionsMenu.add(VIEW, VIEW_PLACES_MENU_ITEM, 0, "View Places");
    optionsMenu.add(VIEW, VIEW_EVENTS_MENU_ITEM, 1, "View Events");

    // TODO import mdpi n other resources
    MenuItem subMenu1Item = optionsMenu.getItem();
    subMenu1Item.setIcon(R.drawable.ic_action_view).setShowAsAction(
            MenuItem.SHOW_AS_ACTION_ALWAYS
                    | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(
        com.actionbarsherlock.view.MenuItem item) {
    switch (item.getItemId()) {

    case VIEW_PLACES_MENU_ITEM:
        Toast.makeText(getActivity(), EXTRA_EVENT_CATEGORY, Toast.LENGTH_SHORT).show();//This toast is displayed two times.
        // TODO clear markers if any
        clearmarkers();
        // TODO put place markers
        PreferenceManager.getDefaultSharedPreferences(getActivity()).edit()
                .putInt(PREF_MAP_VIEW, VIEW_LOC).commit();
        putLocationMarkers();
        break;
    case VIEW_EVENTS_MENU_ITEM:
        // TODO clear markers if any
        clearmarkers();
        // TODO put event markers
        PreferenceManager.getDefaultSharedPreferences(getActivity()).edit()
                .putInt(PREF_MAP_VIEW, VIEW_EVENT).commit();
        putEventMarkers();
        break;
    }
    return super.onOptionsItemSelected(item);
}

private void putEventMarkers() {
    // get all the locations which have events
    Cursor cLocation = db.getReadableDatabase().query(tableEventsName,
            new String[] { colForeignLocationsNameTableEvent }, null, null,
            colForeignLocationsNameTableEvent, null, null);

    if (cLocation.getCount() == 0) {
        Log.d(TAG, "cLocation.getCount()==0");
        return;
    } else {
        Log.d(TAG, "total " + cLocation.getCount()
                + " locations found having events...");
    }

    cLocation.moveToFirst();
    do {
        // get each location name
        String location = cLocation.getString(cLocation
                .getColumnIndexOrThrow(colForeignLocationsNameTableEvent));
        // get the details of this location
        Cursor cLocationDetails = db.getReadableDatabase().query(
                tableLocationsName, null, colNameTableLocations + " =? ",
                new String[] { location }, null, null, null);

        if (cLocationDetails.getCount() != 1) {
            Log.w(TAG,
                    "no. of locations in cursor cLocationDetails in FragmentMaps is not 1!, its:"
                            + cLocationDetails.getCount());
        }

        cLocationDetails.moveToFirst();
        double lat = cLocationDetails.getDouble(cLocationDetails
                .getColumnIndexOrThrow(colLatTableLocations));
        double lng = cLocationDetails.getDouble(cLocationDetails
                .getColumnIndexOrThrow(colLongTableLocations));
        String title = cLocationDetails.getString(cLocationDetails
                .getColumnIndexOrThrow(colNameTableLocations));

        // get list of events for a particular location
        Cursor cEvent = db.getReadableDatabase().query(tableEventsName,
                null, colForeignLocationsNameTableEvent + " =? ",
                new String[] { location }, null, null, null);

        if (cEvent.getCount() == 0) {
            Log.e(TAG, "no events found for the location:" + location);
            /*
             * mMap.addMarker(new MarkerOptions().position( new LatLng(lat,
             * lng)).title(title));
             */} else {
            cEvent.moveToFirst();
            StringBuilder sb = new StringBuilder();
            do {
                sb.append(cEvent.getString(cEvent
                        .getColumnIndexOrThrow(colEventNameTableEvent)));
                sb.append(DELIMITER_SNIPPET);
            } while (cEvent.moveToNext());
            // delete last delimiter
            sb.delete(sb.lastIndexOf(DELIMITER_SNIPPET), sb.length() - 1);

            String snippet = sb.toString();

            mMap.addMarker(new MarkerOptions()
                    .position(new LatLng(lat, lng))
                    .title(getCorrectTitle(title))
                    .snippet(snippet)
                    .icon(BitmapDescriptorFactory
                            .defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)));

        }

    } while (cLocation.moveToNext());

}

private void putLocationMarkers() {

    /*
     * Cursor c = db.getReadableDatabase().query(tableLocationsName, null,
     * null, null, null, null, null);
     */
    Cursor c = db.getReadableDatabase().rawQuery(
            "SELECT * FROM " + tableLocationsName + " WHERE "
                    + colTrivialtableLocations + " !=?",
            new String[] { String.valueOf(TRIVIAL) });

    if (c.getCount() == 0) {
        Log.e(TAG, "cursor doesnt contain locations in FragmentMaps");
        return;
    }

    c.moveToFirst();
    do {
        double lat = c.getDouble(c
                .getColumnIndexOrThrow(colLatTableLocations));
        double lng = c.getDouble(c
                .getColumnIndexOrThrow(colLongTableLocations));
        String title = c.getString(c
                .getColumnIndexOrThrow(colNameTableLocations));
        String snippet = c.getString(c
                .getColumnIndexOrThrow(colSnippetTableLocations));
        mMap.addMarker(new MarkerOptions()
                .position(new LatLng(lat, lng))
                .title(getCorrectTitle(title))
                .snippet(snippet)
                .icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_RED)));

    } while (c.moveToNext());

}

@Override
public void onDestroy() {

    if (db != null) {
        db.close();
    }

    super.onDestroy();
}

private void clearmarkers() {

    mMap.clear();

}

private void setupMain() {
    clearmarkers();
    if (PreferenceManager.getDefaultSharedPreferences(getActivity())
            .getInt(PREF_MAP_VIEW, VIEW_LOC) == VIEW_LOC) {
        putLocationMarkers();
    } else {
        putEventMarkers();
    }

}

private void setupMsgMap() {
    String locname = getActivity().getIntent().getStringExtra(
            EXTRA_UPDATE_LOC);
    Log.d(TAG, "the location received by map is:" + locname);

    /*
     * Cursor c = db.getReadableDatabase().query(tableLocationsName, null,
     * colNameTableLocations + "=?", new String[] { locname }, null, null,
     * null);
     */

    Cursor c = db.getReadableDatabase().rawQuery(
            "SELECT * FROM " + tableLocationsName + " WHERE "
                    + colNameTableLocations + "=? LIMIT 1",
            new String[] { locname });

    if (c.getCount() != 1) {
        Log.e(TAG,
                "cursor doesnt contain single location in FragmentMaps it contains:"
                        + c.getCount());
        return;
    }
    c.moveToFirst();
    double lat = c.getDouble(c.getColumnIndexOrThrow(colLatTableLocations));
    double lng = c
            .getDouble(c.getColumnIndexOrThrow(colLongTableLocations));
    String title = c.getString(c
            .getColumnIndexOrThrow(colNameTableLocations));

    mMap.addMarker(new MarkerOptions()
            .position(new LatLng(lat, lng))
            .title(getCorrectTitle(title))
            .icon(BitmapDescriptorFactory
                    .defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)));

}

/**
 * Called when the Go To Bondi button is clicked.
 */
void GoToIITBHU() {
    if (!checkReady()) {
        return;
    }

    changeCamera(CameraUpdateFactory.newCameraPosition(IITBHU));
}

private void changeCamera(CameraUpdate update) {
    changeCamera(update, null);
}

/**
 * Change the camera position by moving or animating the camera depending on
 * the state of the animate toggle button.
 */
private void changeCamera(CameraUpdate update, CancelableCallback callback) {
    // boolean animated = ((CompoundButton)
    // findViewById(R.id.animate)).isChecked();
    if (true) {
        mMap.animateCamera(update, callback);
    } else {
        mMap.moveCamera(update);
    }
}

private String getCorrectTitle(String title) {
    if (title.equalsIgnoreCase(SBGround.NAME)) {
        return "Swatantrata Bhavan Ground";
    } else if (title.equalsIgnoreCase(SB.NAME)) {
        return "Swatantrata Bhavan";
    } else {
        return title;
    }
}

}

2 个答案:

答案 0 :(得分:3)

onOptionsItemSelected方法中,不要在最后调用超类方法

return super.onOptionsItemSelected(item);

而是返回true。

@Override
public boolean onOptionsItemSelected(
        com.actionbarsherlock.view.MenuItem item) {
    switch (item.getItemId()) {

    case VIEW_PLACES_MENU_ITEM:
        Toast.makeText(getActivity(), EXTRA_EVENT_CATEGORY, Toast.LENGTH_SHORT).show();//This toast is displayed two times.
        // TODO clear markers if any
        clearmarkers();
        // TODO put place markers
        PreferenceManager.getDefaultSharedPreferences(getActivity()).edit()
                .putInt(PREF_MAP_VIEW, VIEW_LOC).commit();
        putLocationMarkers();
        break;
    case VIEW_EVENTS_MENU_ITEM:
        // TODO clear markers if any
        clearmarkers();
        // TODO put event markers
        PreferenceManager.getDefaultSharedPreferences(getActivity()).edit()
                .putInt(PREF_MAP_VIEW, VIEW_EVENT).commit();
        putEventMarkers();
        break;

      default:
            return super.onOptionsItemSelected(item);
    }
    return true;
}

答案 1 :(得分:0)

我有同样的问题。 什么对我有用:

替换

return super.onOptionsItemSelected(item);

return true;

并且不要在onOptionsItemSelected中进行超级调用。 我希望这对你也有用。

相关问题