我有一个 ViewPager ,包含3个碎片。我可以有选择地仅为我想要的片段设置操作栏菜单选项。
同样,我想在ActionBar 中通过Spinner提供导航列表。同样,导航列表应仅出现在ViewPager的片段之一而不是所有片段。然而,我对此的尝试失败了。导航列表显示在操作栏中,但仍保留在所有片段中。
下面是我在ViewPager中使用的一个片段。我希望导航列表仅在我在视图中滑动此片段时才会出现。
public class TransactionsFragment extends SherlockFragment implements
ActionBar.OnNavigationListener{
private ActionBar mActionBar;
@SuppressLint("NewApi")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(
R.layout.fragment_transactions, container, false);
// Set up the action bar to show a dropdown list
mActionBar = getActivity().getActionBar();
mActionBar.setDisplayShowTitleEnabled(false);
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
final String[] dropdownValues = {"Test","Old"};
// Specify a SpinnerAdapter to populate the dropdown list
ArrayAdapter<String> adapter = null;
if(android.os.Build.VERSION.SDK_INT >= 14) {
adapter = new ArrayAdapter<String>(mActionBar.getThemedContext(),
android.R.layout.simple_spinner_item, android.R.id.text1,
dropdownValues);
} else {
adapter = new ArrayAdapter<String>(getActivity().getBaseContext(),
android.R.layout.simple_spinner_item, android.R.id.text1,
dropdownValues);
}
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Set up the dropdown list navigation in the action bar.
mActionBar.setListNavigationCallbacks(adapter, this);
return rootView;
}
如何限制导航列表仅在此片段可见时才会显示?
答案 0 :(得分:2)
我有与OP相同的需求,并使用了Matthias建议的方法,以及来自其他来源的位。对我来说,作为Android的新手,这是一个挑战。我将提供更多详细信息,这可能对通过搜索到达此处的其他人有所帮助。
此代码的所有代码都在显示导航微调器的一个片段中。其他片段没有混乱。
private ActionBar actionBar;
public void onResume() {
super.onResume();
if(actionBar==null) {
actionBar = getActivity().getActionBar();
// get spinner items defined in values/strings/dropdown
final String[] dropdownValues = getResources().getStringArray(R.array.dropdown);
// set up the actionbar appearance
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
// Specify a SpinnerAdapter to populate the dropdown list.
ArrayAdapter<String> aAdapter = new ArrayAdapter<String>(actionBar.getThemedContext(),
android.R.layout.simple_spinner_item, android.R.id.text1,dropdownValues);
aAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// setup for callbacks to detect item selection
actionBar.setListNavigationCallbacks(aAdapter, this);
}
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
//System.err.println("Spinner selection: " + itemPosition);
//do stuff based on itemPosition
return false;
}
最后,更完整的代码可以打开和关闭导航微调器:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (actionBar!=null) {
if (isVisibleToUser) {
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
}
else {
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
}
}
}
编辑:此外,Fragment必须实现ActionBar.OnNavigationListener,就像这样......
public class DisplayStuffFragment extends Fragment implements ActionBar.OnNavigationListener {
...
}
答案 1 :(得分:1)
Fragment#setUserVisibleHint(boolean isVisibleToUser)
。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// enable action bar list navigation
} else {
// disable action bar list navigation
}
}