微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android-ViewPager和ActionBar(Sherlock)的奇怪错误/行为

以下错误将在2.3设备上发生,我的设置在4.x设备上运行正常.

我有一个ViewPager,其中包含一些片段(它们都是同一类).
每个片段都会增加其自己的菜单,因为菜单项可能因片段而异.

为了进行测试,我在ActionBar中设置了一个菜单项(该ActionBar显示图片底部,因为它是一个拆分的ActionBar).轻按Item时,应将“片段”中的TextView设置为“单击”.这从一开始就起作用,但是稍微滑动一下,就会发生:

菜单项被点击时,什么也没有发生.相反,只要我轻扫到下一个片段,下一个片段就会将其TextView设置为“单击”.似乎ActionBar及其菜单与下一个Fragment相关联.

继承人的照片

这是一些代码

我的活动:

public class MyActivity extends SherlockFragmentActivity implements
    MyFragment.InvalidateListener {

ViewPager viewPager;
SectionsPagerAdapter pagerAdapter;


public void invalidate() {
    ActivityCompat.invalidateOptionsMenu(act);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.empty_viewpager);

    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setdisplayHomeAsUpEnabled(true);



    pagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(pagerAdapter);
    viewPager.setCurrentItem(initialIndex);


}


public class SectionsPagerAdapter extends FragmentPagerAdapter {
    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {

        Fragment fragment = new MyFragment();
        fragment.setHasOptionsMenu(true);


        return fragment;
    }

    // ...
}

我的片段:

public class MyFragment extends SherlockFragment {

HashSet<ImageView> runningImageTasks = new HashSet<ImageView>();


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);



}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_expose, null);

}




@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_grundstueckexpose, menu);

    // ...

}

@Override
public boolean onoptionsItemSelected(MenuItem mitem) {

    switch (mitem.getItemId()) {

    case android.R.id.home:
        getActivity().finish();
        return true;

    case R.id.myitem:

        textView.setText("clicked"); 

        return true;

    default:
        return super.onoptionsItemSelected(mitem);
    }
}





}

是否有其他人经历过类似的事情,或者对这里可能存在的问题有想法?

解决方法:

问题在于,内部类ActionMenuItemView无法正确处理MotionEvent(实际上,此类中没有任何特定行为).

因此,我没有解决最初的问题,但是找到了解决方法.我只是重写ActionMenuItemView.dispatchTouchEvent()并使用GestureDetector手动处理单击和长按.

您可以在github上检查此解决方案.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐