1

我有一个带有 3 个片段的ViewPager 。我只能为我想要的片段有选择地设置操作栏菜单选项。

同样,我想通过 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;
    }

如何限制导航列表仅在此片段可见时出现?

4

2 回答 2

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

编辑:另外,片段必须实现 ActionBar.OnNavigationListener,像这样......

public class DisplayStuffFragment extends Fragment implements ActionBar.OnNavigationListener {

...
}
于 2014-12-19T18:51:51.460 回答
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
    }
}
于 2013-06-04T20:45:57.613 回答