我正在开发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;
}
}
答案 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;
}
}
}