【问题标题】:Show menu items depending ViewPager Android根据 ViewPager Android 显示菜单项
【发布时间】:2015-04-05 04:52:11
【问题描述】:

我的 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 时显示菜单项图标。

【问题讨论】:

  • 你可以实现 OnPageChangeListener developer.android.com/reference/android/support/v4/view/… 并且你可以在 onPageSelected 函数中做任何你想做的事情。
  • 我已经用 onPageChangeListener 更新了我的代码,但是我如何在其中创建菜单呢?谢谢
  • 这里会调用invalidateOptionMenu函数onCreateOptionMenu,你可以根据可见页面膨胀菜单
  • 通过调用 invalidateOptionMenu 函数 onCreateOptionMenu 将被调用在这里你可以根据可见页面膨胀菜单像这样 MenuInflater inflater=getMenuInflater(); inflater.inflate(R.menu.menu,menu);
  • 对不起,我的英语说得不太好,我必须在哪里调用 invalidateOptionsMenu?可以放示例代码吗?对不起。

标签: android android-actionbar android-viewpager menu-items


【解决方案1】:

活动菜单

设置您的主菜单,不包括与您的片段相关的菜单项。 IE。

<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:orderInCategory="300"
        app:showAsAction="never" />

    <item
        android:id="@+id/action_help"
        android:title="@string/action_help"
        android:orderInCategory="400"
        app:showAsAction="never"
        android:visible="true"/>
</menu>

第一个片段菜单(我的用于资产)

<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <item
        android:id="@+id/action_add_asset"
        android:title="@string/add_new_asset"
        android:orderInCategory="100"
        app:showAsAction="never" />

    <item
        android:id="@+id/action_edit_asset_type"
        android:title="@string/edit_asset_types"
        android:orderInCategory="200"
        app:showAsAction="never" />

</menu>

第二个片段菜单(负债)

<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <item
        android:id="@+id/action_add_liability"
        android:title="@string/add_new_liability"
        android:orderInCategory="100"
        app:showAsAction="never" />

    <item
        android:id="@+id/action_edit_liability_type"
        android:title="@string/edit_liability_types"
        android:orderInCategory="200"
        app:showAsAction="never" />
</menu>

片段代码(两者都适用)

在你的 onActivityCreated 中的每个片段中:

  setHasOptionsMenu(true);

片段 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
}

片段 2 代码

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 显示菜单的正确顺序。

没有其他要求,你不需要隐藏/显示任何东西。

【讨论】:

    【解决方案2】:

    我回答我自己的问题:

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

    【讨论】:

      【解决方案3】:

      首先在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()

      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          // Inflate the menu; this adds items to the action bar if it is present.
          getMenuInflater().inflate(R.menu.menu_main, menu);
          if (mViewPager.getCurrentItem()==0){
              menu.findItem(R.id.action_search).setVisible(true);
          } else if(mViewPager.getCurrentItem()==1){
              menu.findItem(R.id.action_search).setVisible(false);
          } else if(mViewPager.getCurrentItem()==2){
              // configure
          } else if(mViewPager.getCurrentItem()==3){
              // configure
          }
          return super.onCreateOptionsMenu(menu);
      }
      

      【讨论】:

      • onPrepareOptionsMenu 和 addOnPageChangeListener - 有谁比另一个更好,或者他们是一样的......
      【解决方案4】:

      好的..您将不得不使用ViewPager.OnPageChangeListener 来监视 onPageSelected() 方法,该方法将在您更改 ViewPager 的页面时触发。您必须跟踪当前页面是什么,并在每次调用 onPageSelected() 时向ActivityCompat.invalidateOptionsMenu 发送调用。这个 invalidateOptionsMenu() 是让它工作的关键,它将负责触发选项菜单的“刷新”。这将间接调用 onCreateOptionsMenu() 方法,你有有机会根据所选标签“隐藏”或“显示”一组不同的项目。

      例如:

      public boolean onCreateOptionsMenu(Menu menu) {
         ///
      
         if (currentPageIdx == 4) {
            // inflate menu for page 4
            // configure the menus
         } ....
      
      
        return super.onCreateOptionsMenu(menu);
      }
      

      【讨论】:

      • 我已经用 onPageChangeListener 更新了我的代码,但是我如何在其中创建菜单呢?谢谢
      • 您必须创建 onCreateOptionsMenu() 方法..创建菜单的方法...在 onPageSelected() 上您只需要调用:invalidateOptionsMenu();其余的逻辑将在我的示例中编写的 onCreateOptionsMenu() 上进行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 2016-08-20
      • 1970-01-01
      • 2017-09-05
      • 2014-02-08
      • 2011-08-15
      相关资源
      最近更新 更多