Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为片段调用了两次onContextItemSelected_Android_Android Listview_Actionbarsherlock_Android Viewpager_Contextual Action Bar - Fatal编程技术网

Android 为片段调用了两次onContextItemSelected

Android 为片段调用了两次onContextItemSelected,android,android-listview,actionbarsherlock,android-viewpager,contextual-action-bar,Android,Android Listview,Actionbarsherlock,Android Viewpager,Contextual Action Bar,我的应用程序有一个列表视图,我正在为SDK 11以上的设备使用上下文操作栏,为旧设备使用旧的弹出上下文操作。我知道有一种方法可以在旧设备上使用CAB,但我试着实现它,发现对于最终将被淘汰的设备来说,付出的努力是不值得的。我知道这是一些代码重复,但是,理论上,我将摆脱旧的弹出操作(强调“理论上”) 无论如何,当我使用emulator时,CAB工作正常,但是当我在该事件中设置断点时,旧设备的旧弹出操作似乎命中了onContextItemSelected两次。我刚刚开始为我的应用程序实现一个ViewP

我的应用程序有一个
列表视图
,我正在为SDK 11以上的设备使用
上下文操作栏
,为旧设备使用旧的弹出上下文操作。我知道有一种方法可以在旧设备上使用CAB,但我试着实现它,发现对于最终将被淘汰的设备来说,付出的努力是不值得的。我知道这是一些代码重复,但是,理论上,我将摆脱旧的弹出操作(强调“理论上”)

无论如何,当我使用emulator时,CAB工作正常,但是当我在该事件中设置断点时,旧设备的旧弹出操作似乎命中了
onContextItemSelected
两次。我刚刚开始为我的应用程序实现一个
ViewPager
,而这在
ViewPager
之前没有发生过,因此不确定这是否是问题的原因

这是我正在使用的代码:

public class MyFragment extends SherlockListFragment
{
    private ListView mListView;
    private android.view.ActionMode mActionMode;

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

    @Override
    public void onCreateContextMenu(final ContextMenu menu, final View v, final ContextMenuInfo menuInfo) 
    {
          super.onCreateContextMenu(menu, v, menuInfo);

         if (this.mActionMode != null) return;

          menu.add(1, 0, 0, "Delete");
          menu.add(1, 1, 0, "Save");
    }

    @Override
    public void onActivityCreated(final Bundle icicle)
    {    
        mListView = getListView();

        if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB)
        {   
            mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);

            mListView.setMultiChoiceModeListener(new MultiChoiceModeListener() {

                @Override
                public boolean onCreateActionMode(android.view.ActionMode mode, android.view.Menu menu) {
                    // Inflate the menu for the CAB
                    menu.clear();
                    menu.add(1, 1, 2, "Delete").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
                    menu.add(1, 3, 1, "Save").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

                    return true;
                }

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

                    mActionMode = mode;

                    if (item.getGroupId() == 1) 
                    {
                        switch(itemId)
                        {
                            case 0:
                                DeleteItem();
                                break;
                            case 1:
                                SaveItem();
                                break;
                        }
                    }
                }
            }
        }
    }

    @Override
    public boolean onContextItemSelected(final android.view.MenuItem item) {

        if (item.getGroupId() == 1) {

            final AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();
            final Integer position = info.position;
            final int itemId = item.getItemId();

            switch(itemId)
            {
                case 0:
                    DeleteItem();
                    break;
                case 1:
                    SaveItem();
                    break;
            }
        }

        return super.onContextItemSelected(item);
    }

    @Override
    public void onPrepareOptionsMenu(Menu menu) {

        super.onPrepareOptionsMenu (menu);
    }

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

        super.onCreateOptionsMenu(menu, inflater);
    }
}
查看寻呼机代码

public class Main extends SherlockFragmentActivity
{
    private static List<Integer> mIds;

    @Override
    public void onCreate(final Bundle icicle)
    {    
        super.onCreate(null);

        setContentView(R.layout.main);

        mViewPager = (ViewPager)findViewById(R.id.viewpager); //view pager exists, so we are using the portait layout

        if (mViewPager != null)
        {
            mIds = new ArrayList<Integer>();

            mIds.add(0);
            mIds.add(1);
            mIds.add(2);
        }
        else //in landscape
        {           
            ListFragment lf = (ListFragment)getSupportFragmentManager().findFragmentById(R.id.fragmentList);

            if (lf == null)
                lf = new ListFragment();

            DetailFragment df = (DetailFragment)getSupportFragmentManager().findFragmentById(R.id.fragmentDetail);

            if (df == null)
            {
                df = new DetailFragment();
                df.setArguments(getIntent().getExtras());   
            }

            getSupportFragmentManager().beginTransaction().add(R.id.fragmentList, lf).commit();
            getSupportFragmentManager().beginTransaction().add(R.id.fragmentDetail, df).commit();
        }
    }       

    private static class MyFragmentPagerAdapter extends FragmentStatePagerAdapter  {  

        public MyFragmentPagerAdapter(FragmentManager fm) {  
             super(fm);  
        }  

        @Override  
        public Fragment getItem(int index) {        
            //can't use getSupportFragmentManager().findFragmentById() here because I get a "Cannot make a static reference to the non-static method" error
            if (index == 0)
                return ListFragment.newInstance();
            else            
                return DetailFragment.newInstance(mIds.get(index-1));
        }  

        @Override
        public int getCount() {  
             return 4;
        }
   }  
}
public类主扩展SherlockFragmentActivity
{
私有静态列表MID;
@凌驾
创建后的公共空间(最终捆绑冰柱)
{    
super.onCreate(null);
setContentView(R.layout.main);
mViewPager=(ViewPager)findViewById(R.id.ViewPager);//视图页面存在,因此我们使用的是portait布局
如果(mViewPager!=null)
{
mIds=新的阵列列表();
中加(0);
中加(1);
中加(2);
}
景观设计
{           
ListFragment lf=(ListFragment)getSupportFragmentManager().findFragmentById(R.id.fragmentList);
如果(lf==null)
lf=新的ListFragment();
DetailFragment df=(DetailFragment)getSupportFragmentManager().findFragmentById(R.id.fragmentDetail);
如果(df==null)
{
df=新的DetailFragment();
setArguments(getIntent().getExtras());
}
getSupportFragmentManager().beginTransaction().add(R.id.fragmentList,lf.commit();
getSupportFragmentManager().beginTransaction().add(R.id.fragmentDetail,df.commit();
}
}       
私有静态类MyFragmentPagerAdapter扩展了FragmentStatePagerAdapter{
公共MyFragmentPagerAdapter(FragmentManager fm){
超级(fm);
}  
@凌驾
公共片段getItem(int索引){
//无法在此处使用getSupportFragmentManager().findFragmentById(),因为我遇到“无法对非静态方法进行静态引用”错误
如果(索引==0)
返回ListFragment.newInstance();
其他的
返回DetailFragment.newInstance(mIds.get(index-1));
}  
@凌驾
public int getCount(){
返回4;
}
}  
}

这个问题的解决方案解决了我的问题:


onContextItemSelected
方法中使用
getUserVisibleHint()
必须返回
true
才能使用所选内容。


似乎击中了?如果选择Delete,DeleteItem()方法将被调用两次?@Luksprog Yes,实际上在
DeleteItem()
中,我正在使用
AlertDialog
确认删除操作,两个对话框一个接一个地显示。在
DeleteItem()
中放置断点会被命中两次。您能否发布ViewPager的代码(它的适配器,我猜您使用的片段列表与前面的问题相同)?正如您所说,在
ViewPager
一切正常之前,它一定与该ViewPager有关。@Luksprog我用
ViewPager
codegetUserVisibleHint()更新了问题,当您有同一类的多个片段时,它是不可靠的。在这种情况下,您可以使用下一个答案:
    @Override
    public boolean onContextItemSelected(final android.view.MenuItem item) {

        if (item.getGroupId() == 1) {

            final AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();
            final Integer position = info.position;
            final int itemId = item.getItemId();

            switch(itemId)
            {
                case 0:
                    DeleteItem();
                    return true;
                case 1:
                    SaveItem();
                    return true;
            }
        }

        return super.onContextItemSelected(item);
    }