如何在ViewPage的操作栏上添加仅在某些片段上可见的导航列表?

时间:2013-05-31 19:41:34

标签: android navigation android-actionbar android-viewpager spinner

我有一个 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;
    }

如何限制导航列表仅在此片段可见时才会显示?

2 个答案:

答案 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
    }
}