onOptionsItemSelected钩子调用了错误的片段

时间:2014-07-17 15:37:43

标签: java android android-fragments tabs

我有一个简单的活动,FragmentPagerAdapterFragments中显示了一些图表。我可以通过点击ActionBar中的标签或在其中一侧滑动来浏览它们。这就是Fragment的样子:

public static class ChartFragment extends Fragment {

    private static final String ARG_SECTION_NUMBER = "section_number";
    private int section;

    /**
     * Returns a new instance of this fragment for the given section number.
     */
    public static ChartFragment newInstance(int sectionNumber) {
        ChartFragment fragment = new ChartFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public ChartFragment() {
        // enable menu for fragment
        setHasOptionsMenu(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        int arg = getArguments().getInt(ARG_SECTION_NUMBER);
        section = arg;
        return generateChart(arg);
    }

    private View generateChart() {
        // generate the chart
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
       // handle item selection
       switch (item.getItemId()) {
          case R.id.action_button:
             Log.e(TAG, "Section: " + section);
             return true;
          default:
             return super.onOptionsItemSelected(item);
       }
    }
}

(供您参考:代码示例基于此内置于ADT中的代码示例)

我已为ActionBar启用了每个片段的菜单,并在onOptionsItemSelected挂钩中处理了点击。在ActionBar中手动选择标签时,一切正常,但在浏览片段并在导航到ActionBar后不久点击action_button按钮Fragment时,显示先前显示的Fragment
我该怎么做才能使这种行为成为正常的#34;什么时候刷?

1 个答案:

答案 0 :(得分:0)

在进行滑动时,最后一个完全显示的片段处理onOptionsItemSelected钩子。为了避免用户单击错误片段的按钮,我只是在转换时阻止按钮单击触发的操作。 因此我使用这个监听器:

mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrollStateChanged(int arg0) {
            if (arg0 == 0) {
                isScrolling = false;
            } 
            else {
                isScrolling = true;
            }               
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {

        }

        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }           
});

第二种方法:

跟踪所有Fragment个实例并处理活动中的挂钩。