2013-05-16 50 views
3

行为对以下错误会发生的2.3设备上,我的设置适用于4.x的设备的罚款。奇怪的错误/用ViewPager和动作条(福尔摩斯)

我有一个ViewPager的一些碎片(它们都是同一个班级)。 每个片段都会膨胀它自己的菜单,因为菜单项可能因片段不同而不同。

为了测试目的,我在ActionBar中设置了菜单项(ActionBar显示在图片的底部,因为它是一个拆分的ActionBar)。当轻击项目时,片段中的TextView应设置为“单击”。这在一开始就起作用,但是在稍微弹一下之后,会发生这种情况:

当点击菜单项时,什么都不会发生。相反,只要我滑动到下一个片段,下一个片段将其TextView设置为“单击”。它看起来像ActionBar和它的菜单与下一个片段相关联。

继承人PIC

bug

而且继承人一些代码:

我的活动:

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





} 

有没有其他人经历过这样的事情,或者对这里的问题有什么想法?

+0

调用supportInvalidateOptionsMenu代替invalidateOptionsMenu – Greensy

回答

4

问题是MotionEvent没有通过内部类ActionMenuItemView正确处理(实际上,此类中没有任何特定行为)。

所以,我不解决最初的问题,但我觉得解决办法解决方案。我只是覆盖ActionMenuItemView.dispatchTouchEvent()并使用GestureDetector手动点击和长按手动。

您可以github检查此解决方案。

0

我不知道这个确切问题,但翻转设备时,我有一个问题。该应用程序崩溃。最后,我发现这是Pager类的问题,因为我像实施SectionsPagerAdapter类一样实施它们。

我把主类上的公共类放在分离的类上,并且布局在垂直和水平位置上运行良好。

我不知道这是否可能是问题,但您可以尝试创建相应的类,而不是将它们留在主类上。无论如何,你传递给SegmentPagerAdapter的FragmentManager,所以你不会有任何额外的问题把公共类放在他们各自的文件。

祝你好运!