Панель действий Android на NavigationItemSelected - PullRequest
11 голосов
/ 01 марта 2012

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

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

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

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

}

Ответы [ 5 ]

16 голосов
/ 14 марта 2012

Вы можете просто проигнорировать первый звонок на 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 
    }
}
4 голосов
/ 06 декабря 2013

Метод 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.

2 голосов
/ 20 марта 2013

Система Android вызовет метод NavigationItemSelected (0, 0) после настройки действия. (Что означает позже, чем onResume ()).

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

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

0 голосов
/ 30 мая 2013

У меня есть viewpager с фрагментами, и мне нужно установить панель пользовательских действий для каждого фрагмента в pager На нужной странице у меня есть список навигации, фрагмент запускается 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;
    }

}

}
0 голосов
/ 07 марта 2012

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

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

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

...