根据ViewPager Android显示菜单项

根据ViewPager Android显示菜单项,android,android-actionbar,android-viewpager,menu-items,Android,Android Actionbar,Android Viewpager,Menu Items,我的Android应用程序中有一个带有片段的ViewPager。我想根据ViewPager的片段显示操作栏菜单项。我已经阅读了一些关于这个的问题,但是我找不到正确的解决方案。我的ViewPager代码如下: public class My_Activity extends ActionBarActivity { private ViewPager mViewPager; String idioma; @Override protected void onCre

我的Android应用程序中有一个带有片段的ViewPager。我想根据ViewPager的片段显示操作栏菜单项。我已经阅读了一些关于这个的问题,但是我找不到正确的解决方案。我的ViewPager代码如下:

public class My_Activity extends ActionBarActivity {

    private ViewPager mViewPager;
    String idioma;

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

        ActionBar actionBar = getSupportActionBar(); // || getActionBar();
        actionBar.setIcon(getResources().getDrawable(R.drawable.navbar_logo));
        actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#CC3333")));

        actionBar.setTitle("Hello");

        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        PagerTabStrip pagerTabStrip = (PagerTabStrip) findViewById(R.id.pagerTabStrip);
        pagerTabStrip.setTabIndicatorColor(getResources().getColor(R.color.blanco));

        Title_Liga_Adapter titleAdapter = new Title_Liga_Adapter(getSupportFragmentManager());
        mViewPager.setAdapter(titleAdapter);

        mViewPager.setCurrentItem(0);

        getSupportActionBar().setIcon(R.drawable.navbar_logo);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        if (mViewPager.getCurrentItem() == 4) {
            getMenuInflater().inflate(R.menu.menu_comunidad,
                                      menu);
        } else {

        }
        return true;
    }

    /* *
     * Called when invalidateOptionsMenu() is triggered
     */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {

        menu.findItem(R.id.action_search)
            .setVisible(true);

        return super.onPrepareOptionsMenu(menu);
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            // Respond to the action bar's Up/Home button
            case android.R.id.home:
                this.finish();
                return true;

            case R.id.action_search:

                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }

}

例如,当CurrentItem为4时,我希望显示菜单项图标。

确定..您必须使用在哪里监视方法onPageSelected(),该方法将在您更改ViewPager页面时触发。您必须跟踪当前页面,并在每次调用onPageSelected()时向发送一个调用。此InvalidateOptions功能表()是使其工作的关键,它将负责触发选项菜单的“刷新”。将间接调用OnCreateOptions功能表()的方法将被调用,并且您有机会根据所选选项卡“隐藏”或“显示”不同的项目集

例如:

public boolean onCreateOptionsMenu(Menu menu) {
   ///

   if (currentPageIdx == 4) {
      // inflate menu for page 4
      // configure the menus
   } ....


  return super.onCreateOptionsMenu(menu);
}

我回答我自己的问题:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.menu_comunidad,
                              menu);

    return true;
}

// Called when invalidateOptionsMenu() is triggered
@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    if (mViewPager.getCurrentItem() == 4) {
        menu.findItem(R.id.action_search)
            .setVisible(true);
    } else {
        menu.findItem(R.id.action_search)
            .setVisible(false);
    }
    return super.onPrepareOptionsMenu(menu);
}

public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
            this.finish();
            return true;

        case R.id.action_search:

            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

首先在onCreate方法中创建addOnPageChangeListener

ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
           // ...

    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            invalidateOptionsMenu();
        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });
}
然后重写onCreateOptionMenu()


活动菜单

设置主菜单,排除与片段相关的菜单项。 即

片段1代码

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    super.onCreateOptionsMenu(menu, inflater)

    try {
        inflater.inflate(R.menu.menu_asset, menu)
    } catch (e: NullPointerException) {
        e.printStackTrace()
    }
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val id = item.itemId

    if (id == R.id.action_add_asset) {
        startNewActivity(NewAssetActivity::class.java)
        return true
    } else if (id == R.id.action_edit_asset_type) {
        startNewActivity(AssetTypeActivity::class.java)
        return true
    }
    return false
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    super.onCreateOptionsMenu(menu, inflater)

    try {
        inflater.inflate(R.menu.menu_liability, menu)
    } catch (e: NullPointerException) {
        e.printStackTrace()
    }
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val id = item.itemId

    if (id == R.id.action_add_liability) {
        startNewActivity(NewLiabilityActivity::class.java)
        return true
    } else if (id == R.id.action_edit_liability_type) {
        startNewActivity(LiabilityTypeActivity::class.java)
        return true
    }
    return false
}
片段2代码

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    super.onCreateOptionsMenu(menu, inflater)

    try {
        inflater.inflate(R.menu.menu_asset, menu)
    } catch (e: NullPointerException) {
        e.printStackTrace()
    }
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val id = item.itemId

    if (id == R.id.action_add_asset) {
        startNewActivity(NewAssetActivity::class.java)
        return true
    } else if (id == R.id.action_edit_asset_type) {
        startNewActivity(AssetTypeActivity::class.java)
        return true
    }
    return false
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    super.onCreateOptionsMenu(menu, inflater)

    try {
        inflater.inflate(R.menu.menu_liability, menu)
    } catch (e: NullPointerException) {
        e.printStackTrace()
    }
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val id = item.itemId

    if (id == R.id.action_add_liability) {
        startNewActivity(NewLiabilityActivity::class.java)
        return true
    } else if (id == R.id.action_edit_liability_type) {
        startNewActivity(LiabilityTypeActivity::class.java)
        return true
    }
    return false
}
使用查看页面在片段之间滑动时,菜单将自动更改

使用orderInCategory显示菜单的正确顺序


不需要其他任何东西,您不需要隐藏/显示任何东西。

您可以实现OnPageChangeListener,并且可以在onPageSelected函数中执行任何您想执行的操作。我已经用OnPageChangeListener更新了我的代码,但是我如何在其中创建菜单?Thanks通过调用InvalidateOptions菜单函数OnCreateOptions菜单将在此处调用,您可以根据可视页面对菜单进行充气通过调用InvalidateOptions菜单函数OnCreateOptions菜单将在此处调用,您可以根据可视页面对菜单进行充气,如下图所示MenuInflater=getMenuInflater();充气机。充气(右菜单。菜单,菜单);对不起,我英语说得不太好,我要打电话到哪里?你能给出示例代码吗?对不起,我已经用onPageChangeListener更新了我的代码,但是我如何在其中创建菜单呢?感谢您必须创建onCreateOptions菜单()方法..即创建菜单的方法…在onPageSelected()上,您只需调用:invalidateOptions菜单();其余的逻辑将在onCreateOptions菜单()上运行,如我的示例中所述。OnPrepareOptions菜单和addOnPageChangeListener-是否有人比另一个更好,或者他们是相同的。。。
  setHasOptionsMenu(true);
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    super.onCreateOptionsMenu(menu, inflater)

    try {
        inflater.inflate(R.menu.menu_asset, menu)
    } catch (e: NullPointerException) {
        e.printStackTrace()
    }
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val id = item.itemId

    if (id == R.id.action_add_asset) {
        startNewActivity(NewAssetActivity::class.java)
        return true
    } else if (id == R.id.action_edit_asset_type) {
        startNewActivity(AssetTypeActivity::class.java)
        return true
    }
    return false
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    super.onCreateOptionsMenu(menu, inflater)

    try {
        inflater.inflate(R.menu.menu_liability, menu)
    } catch (e: NullPointerException) {
        e.printStackTrace()
    }
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val id = item.itemId

    if (id == R.id.action_add_liability) {
        startNewActivity(NewLiabilityActivity::class.java)
        return true
    } else if (id == R.id.action_edit_liability_type) {
        startNewActivity(LiabilityTypeActivity::class.java)
        return true
    }
    return false
}