Панель действия android onNavigationItemSelected

Я разрабатываю для android 3 +

В моей панели действий у меня есть раскрывающийся список (см. как скрыть/отобразить список действий на Android-андроиде 3? для раскрывающегося списка, который я намерен). Проблема в том, что мне нужно сделать какое-то действие, когда пользователь что-то выбирает, но Android вызывает onNavigationItemSelected() так же, как он рисует представление, поэтому никакого выбора на самом деле не произошло.

Как я могу определить, действительно ли пользователь что-то нажал, и это не поддельный вызов от android?

public class ListDittaListener implements OnNavigationListener{

    private BaseActivity activity;

    private ListDittaListener()
    {

    }

    public ListDittaListener(BaseActivity activity)
    {
        this.activity = activity;
    }

    @Override
    public boolean onNavigationItemSelected(int itemPosition, long itemId)
    {
        MyApp appState = ((MyApp)this.activity.getApplicationContext());
        appState.setDittaSelezionata( (int) itemId);

        SharedPreferences settings = this.activity.getSharedPreferences(MyApp.PREFS_NAME, 0);
        SharedPreferences.Editor editor = settings.edit();
        editor.putInt("ditta_id_selezionata", (int) itemId);

            ////////restart activity this.activity.recreate();

        return false;
    }

}

Ответ 1

Вы можете просто просто проигнорировать первый вызов onNavigationItemSelected, если хотите:

public class Whatever implements OnNavigationListener {
    private boolean synthetic = true;

    @Override
    public boolean onNavigationItemSelected(int itemPosition, long itemId) {
        if (synthetic) {
            synthetic = false;
            return true;
        }

        // do whatever you really wanted here 
    }
}

Ответ 2

Метод onNavigationItemSelected(int itemPosition, long itemId) будет вызываться в любом случае панелью действий.

Что вы можете сделать, так это сообщить панели действий, что itemPosition она должна перейти к методу при первом вызове. (Другими словами, чтобы сообщить панели действий, какой элемент навигации следует установить после создания активности). Вот код:

mActionBarMenuSpinnerAdapter = ...;
mActionBar = getActionBar();
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
mActionBar.setListNavigationCallbacks(mActionBarMenuSpinnerAdapter, this);
mActionBar.setSelectedNavigationItem(###your_default_navigation_item_here###);

После этого вы можете решить свою проблему, применив изменения в onNavigationItemSelected(int itemPosition, long itemId), если только itemPosition отличается.

Ответ 3

После установки активности система андроида будет вызывать onNavigationItemSelected (0, 0). (Это означает, что позже, чем onResume()).

Как отмечали другие ребята, вам лучше не делать взлома, как игнорировать первый звонок, иначе система Android не будет вызывать onNavigationItemSelected() снова, когда вы выберете первый индекс. (Система считала, что первый элемент уже выбран)

Мое решение - вызвать actionbar.setSelectedNavigationItem(реальный элемент #, который вы хотите) после настройки панели действий. Затем система будет вызывать onNavigationItemSelected() дважды. Сначала onNavigationItemSelected (0, 0), а затем onNavigationItemSelected (реальный элемент #).

Ответ 4

Ну, я не вижу ничего плохого в вашем текущем коде.

Как вы создали свои выпадающие элементы. И какой элемент "выбирает" Android после создания представления. И что вы делаете в своем методе onCreate, где инициализируется ActionBar.

Я сделал это, как указано здесь, и это сработало для меня: http://developer.android.com/guide/topics/ui/actionbar.html#Dropdown

Ответ 5

У меня есть viewpager с фрагментами, и мне нужно настроить настраиваемую панель действий для каждого фрагмента в пейджере На желаемой странице у меня есть список навигации, фрагмент запускает onNavigationItemSelected автоматически, когда я просматриваю страницы, хочу избежать этого поведения и запускать задачи только в том случае, если я выбрал навигационный элемент вручную.

public class MyFragment extends Fragment implements ActionBar.OnNavigationListener {

    private boolead fireReady = false;

     @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        // every time make it false, this method invoked on swipe action
        fireReady = false; 

        if (isVisibleToUser) {
            // setup actionbar, you also can setup action bar in activity
            String[] array = getActivity().getResources().getStringArray(R.array.users_order);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, array);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

            getActivity().getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
            getActivity().getActionBar().setListNavigationCallbacks(adapter, this);
        }

    }

     @Override
    public boolean onNavigationItemSelected(int itemPosition, long itemId) {

        if (fireReady) {
            // task fire only when you directly press navigation item
            UsersTask task = new UsersTask(getActivity());
            task.setTaskListener(this);
            task.execute(usersUrls[itemPosition]);
        } else {
            // make it true first time when page displayed
            fireReady = true;
        }
        return false;
    }

}

}