当viewpager更改时,关闭上下文操作栏

时间:2014-01-28 20:44:28

标签: android contextual-action-bar

现在我有一个使用viewpager显示多个片段的活动。每个片段都在片段中实现了一个Context Action Bar。我试图将其设置为如果用户在片段之间滚动或标记,则解除之前所选片段的ActionBar。

我想我需要在.finish()的片段中对CAB OnPageChangeListener()进行某种调用,但我不完全确定如何或在何处这样做。

2 个答案:

答案 0 :(得分:1)

创建每个片段中的公共函数,可以调用它来完成ActionMode。可能看起来像这样

public void finishActionMode(){
    [YOUR_ACTIONMODE_VARIABLE].finish();
}

然后在您保存ViewPager的活动中,你应该以某种方式保留或获取ViewPager中应该关闭其ActionMode的片段的引用,然后在你的onPageSelected中你可以调用`[YOUR_FRAGMENT_REFERENCE] .finishActionMode();

像这样:

    mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            [YOUR_FRAGMENT_REFERENCE].finishActionMode();
        }

        ...
    });

要保持对ViewPagers片段的引用,请在此处查看:Retrieve a Fragment from a ViewPager

答案 1 :(得分:0)

您不必为每个片段创建单独的上下文操作栏(CAB)。您只需在TabbedActivity(带分页器的活动)中创建一个 STATIC CAB,并在需要时随时使用它们。

以下是 TabbedActivity.java

的代码片段
public class TabbedActivity extends AppCompatActivity {

public static ActionMode uniActionMode=null;
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
       mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int 
         positionOffsetPixels) {
          if(uniActionMode!=null)
             uniActionMode.finish();
        }

        @Override
        public void onPageSelected(int position)
        {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

}

mViewPager.addOnPageChangeListener用于检查用户是否在片段中移动。现在你要做的就是从任何地方创建一个ActionMode,然后将值传递给静态uniActionMode变量。

mActionModeCallback = new ActionMode.Callback() {

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            // Inflate a menu resource providing context menu items
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.menu_selection, menu);
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
           return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {

            switch (item.getItemId()) {
                case R.id.action_delete:
                    mode.finish();
                    return true;

                case R.id.action_mark_read:

                    mode.finish();
                    return true;
            }
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {

        }
    };

    TabbedActivity.uniActionMode=  v.startActionMode(mActionModeCallback);

此处TabbedActivity.uniActionMode引用选项卡式活动的ActionMode对象。因此,回调将传递给TabbedActivity.uniActionMode