菜单项未检测到用户'点击action_finish按钮

时间:2015-03-04 14:35:24

标签: android android-studio menuitem

我有一个带有寻呼机的ScreenSlideActivity.java滑动片段。由于我想使用屏幕幻灯片动画创建一个教程,我想在用户按下"完成"时将用户导航回主要活动。按钮。 我的问题是onOptionsItemSelected内的菜单项没有检测到用户对"完成"的压力。按钮。这是我的代码:

在onCreateOptionsMenu中,我添加了三个按钮:"上一个","下一个"和"完成",并添加" next"或者"完成"按钮到操作栏,具体取决于当前选择的页面。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.activity_screen_slide, menu);

    menu.findItem(R.id.action_previous).setEnabled(mPager.getCurrentItem() > 0);

    // Add either a "next" or "finish" button to the action bar, depending on which page
    // is currently selected.
    MenuItem item = menu.add(
            Menu.NONE,
            R.id.action_next,
            Menu.NONE,
            (mPager.getCurrentItem() == mPagerAdapter.getCount() - 1) 
                            ? R.string.action_finish : R.string.action_next);
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
    return true;
}

然后在onOptionsItemSelected中我处理与三个按钮的交互

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:

            // Navigate "up" the demo structure to the launchpad activity.
            // See http://developer.android.com/design/patterns/navigation.html for more.
            NavUtils.navigateUpTo(this, new Intent(this, MainActivity.class));
            return true;

        case R.id.action_previous:
            // Go to the previous step in the wizard. If there is no previous step,
            // setCurrentItem will do nothing.
            mPager.setCurrentItem(mPager.getCurrentItem() - 1);
            return true;

        case R.id.action_next:
            // Advance to the next step in the wizard. If there is no next step, setCurrentItem
            // will do nothing.
            mPager.setCurrentItem(mPager.getCurrentItem() + 1);
            return true;

        case R.id.action_finish:
            NavUtils.navigateUpTo(this, new Intent(this, MainActivity.class));
            return true;
    }

    return super.onOptionsItemSelected(item);
}

"之前"按钮在" activity_screen_slide.xml"中创建:

<menu xmlns:android="http://schemas.android.com/apk/res/android">

<!-- Adds an item to the list. -->
<item android:id="@+id/action_previous"
    android:title="@string/action_previous"
    android:showAsAction="ifRoom|withText" />
</menu>

而其他两个只是在&#34; ids.xml&#34;中创建为ID:

<resources>
<!--
    These action bar item IDs (menu item IDs) are defined here for
    programmatic use. Normally, IDs are created using the "@+id/foo"
    syntax,
    but since these IDs aren't created in menu XML, rather
    used for programmatically-instantiated action bar items, they
    are defined here.
-->
<item type="id" name="action_flip" />
<item type="id" name="action_next" />
<item type="id" name="action_finish" />

然后我得到了     以前     下一个     完 在我的string.xml文件中。

因此&#34;之前&#34;按钮是菜单布局文件中唯一定义的按钮; &#34; next&#34;按钮和&#34;完成&#34;按钮既可以作为ID出现,但对于&#34; next&#34;而言,这似乎并不是一个问题。按钮就像它完成&#34;完成&#34;按钮。 为什么它与&#34;完成&#34;相同?按钮?

编辑:已解决

  

解决方案以这种方式工作:

    MenuItem item = menu.add(
            Menu.NONE,   
            (mPager.getCurrentItem() == mPagerAdapter.getCount() - 1)
                    ? R.id.action_finish : R.id.action_next, 
            Menu.NONE,   
            (mPager.getCurrentItem() == mPagerAdapter.getCount() - 1)  
            ? R.string.action_finish : R.string.action_next);  
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
    return true;
}

非常感谢!

2 个答案:

答案 0 :(得分:1)

来自documentation

菜单对象itemId的add()方法中的第二个参数提到:

Unique item ID. Use NONE if you do not need a unique ID.

您为该按钮指定的ID为R.id.action_next。你确实有一个条件,但最后一个参数titleResResource identifier of title string。因此,当您同时更改作为项目ID的add()方法的第二个参数时,您只需更改插入菜单的菜单项上的标题。

结论menu.add()方法的第二个参数必须有另一个条件赋值,其操作方式与第四个参数的方法相同。

答案 1 :(得分:1)

很好的答案,它就是这样的:

    MenuItem item = menu.add(
            Menu.NONE,   
            (mPager.getCurrentItem() == mPagerAdapter.getCount() - 1)
                    ? R.id.action_finish : R.id.action_next, 
            Menu.NONE,   
            (mPager.getCurrentItem() == mPagerAdapter.getCount() - 1)  
            ? R.string.action_finish : R.string.action_next);  
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
    return true;
}