android动作栏onNavigationItemSelected

时间:2012-03-01 14:16:40

标签: android android-actionbar

我正在开发android 3 +

在我的操作栏中,我有一个下拉列表(有关我想要的下拉列表,请参阅how to hide/unhide the actionbar list on android 3?)。问题是我需要在用户选择某些内容时执行某个操作,但Android在绘制视图时调用onNavigationItemSelected()作为soons,因此实际上没有选择。

我怎样才能检测到用户是否真的按下了某些内容并且它不是来自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;
    }

}

5 个答案:

答案 0 :(得分:16)

如果您愿意,可以轻松忽略对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 
    }
}

答案 1 :(得分:4)

操作栏无论如何都会调用方法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 :(得分:2)

安装活动后,android系统将调用onNavigationItemSelected(0,0)。 (这意味着晚于onResume())。

正如其他人提到的那样,你最好不要忽略第一次调用,否则当你选择第一个索引时,android系统不会再次调用onNavigationItemSelected()。 (系统认为已经选择了第一个项目)

我的解决方案是在您设置操作栏后调用actionbar.setSelectedNavigationItem(您想要的真实项目#)。然后系统将调用onNavigationItemSelected()两次。首先是onNavigationItemSelected(0,0),然后是onNavigationItemSelected(真实项目#)。

答案 3 :(得分:0)

我当前的代码中看不出任何错误。

您是如何创建下拉列表元素的?创建视图后,Android会“选择”哪个元素。你在onCreate方法中做了什么,ActionBar初始化了。

我是按照这里的指示做的,它对我有用: http://developer.android.com/guide/topics/ui/actionbar.html#Dropdown

答案 4 :(得分:0)

我有一个带有片段的viewpager,我需要为pager中的每个片段设置自定义操作栏 在我想要的页面中,我有导航列表,当我滑动页面时片段会自动触发导航项目选中,想要避免这种行为并且只有在我手动选择导航项时才能运行任务。

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

}

}