3

现在我有一个使用 viewpager 来显示几个片段的活动。这些片段中的每一个都在片段中实现了一个上下文操作栏。我试图让它在如果用户在片段之间滚动或选项卡时,先前选择的片段的 ActionBar 将被解除。

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

4

2 回答 2

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

        ...
    });

为了保持对 ViewPager 片段的引用,请看这里:Retrieve a Fragment from a ViewPager

于 2014-02-05T17:18:46.430 回答
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.

于 2017-10-13T08:28:49.413 回答