【问题标题】:Action Bar Sherlock old menu on overflowed items溢出项目上的操作栏夏洛克旧菜单
【发布时间】:2013-08-15 16:49:03
【问题描述】:

我正在开发一个带有 Action Bar Sherlock 库的 android 应用程序,它在我的设备上使用 api 17“图像 1”正常运行,但在 api 8 上,我在 itens 上的旧菜单样式脱离了操作栏, “图片 2”,按照我的菜单代码:

菜单 XML 文件:

<item
    android:id="@+id/menu_main_filter"
    android:alphabeticShortcut="@string/action_filter_shortcurt"
    android:icon="@drawable/ic_action_filter"
    android:orderInCategory="100"
    android:showAsAction="ifRoom"
    android:title="@string/action_filter"/>
<item
    android:id="@+id/menu_main_share"
    android:alphabeticShortcut="@string/action_share_shortcurt"
    android:icon="@drawable/ic_action_share"
    android:orderInCategory="101"
    android:showAsAction="ifRoom"
    android:title="@string/action_share"/>
<item
    android:id="@+id/menu_main_about"
    android:alphabeticShortcut="@string/action_about_shortcurt"
    android:icon="@drawable/ic_action_about"
    android:orderInCategory="100"
    android:showAsAction="ifRoom"
    android:title="@string/action_about"/>

<group
    android:id="@+id/menu_main_group_display_settings"
    android:checkableBehavior="single"
    android:orderInCategory="1000" >
    <item
        android:id="@+id/menu_main_use_indian_numbers"
        android:alphabeticShortcut="@string/action_use_indian_numbers_shortcurt"
        android:icon="@drawable/ic_action_indian"
        android:orderInCategory="10001"
        android:showAsAction="ifRoom"
        android:title="@string/action_use_indian_numbers"
        android:titleCondensed="@string/action_use_indian_numbers_condensed"/>
    <item
        android:id="@+id/menu_main_use_arabic_numbers"
        android:alphabeticShortcut="@string/action_use_arabic_numbers_shortcurt"
        android:icon="@drawable/ic_action_arabic"
        android:orderInCategory="10002"
        android:showAsAction="ifRoom"
        android:title="@string/action_use_arabic_numbers"
        android:titleCondensed="@string/action_use_arabic_numbers_condensed"/>
</group>

活动java代码:

public class MainActivity extends AbstractNombrojActivity {

private ListView listView;
private ListMainAdapter<Nombro> listMainAdapter;

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

    listView = (ListView) findViewById(R.id.main_listview);
    listMainAdapter = new ListMainAdapter<Nombro>(getApplicationContext());
    listView.setAdapter(listMainAdapter);
    listView.setEmptyView(findViewById(R.id.main_listview_emptyview));
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.main, menu);
    NombrojPreferences preferences = new NombrojPreferences(getApplicationContext());
    for (int c = 0; c < menu.size(); c++) {
        MenuItem menuItem = menu.getItem(c);
        if (menuItem.getItemId() == R.id.menu_main_use_indian_numbers && preferences.getNumberAlgarism() == NumbersAlgarism.Indian)
            menuItem.setChecked(true);
        if (menuItem.getItemId() == R.id.menu_main_use_arabic_numbers && preferences.getNumberAlgarism() == NumbersAlgarism.Arabic)
            menuItem.setChecked(true);
    }
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_main_use_indian_numbers:
        new NombrojPreferences(getApplicationContext()).setNumberAlgarism(NumbersAlgarism.Indian);
        invalidate();
        return true;
    case R.id.menu_main_use_arabic_numbers:
        new NombrojPreferences(getApplicationContext()).setNumberAlgarism(NumbersAlgarism.Arabic);
        invalidate();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

// custom
private void invalidate() {
    supportInvalidateOptionsMenu();
    listMainAdapter.notifyDataSetChanged();
}

我的应用主题:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

关于价值观:

<style name="AppBaseTheme" parent="@style/Theme.Sherlock.Light.DarkActionBar"></style>
<style name="AppTheme" parent="AppBaseTheme"></style>

关于价值观-v11:

<style name="AppBaseTheme" parent="@style/Theme.Sherlock.Light.DarkActionBar"></style>

和价值观-v14:

<style name="AppBaseTheme" parent="@style/Theme.Sherlock.Light.DarkActionBar"></style>

什么会导致这种错误行为?


图片 1:

图片 2:

非常感谢!

【问题讨论】:

    标签: android menu actionbarsherlock menuitem


    【解决方案1】:

    这是向后兼容的 ActionBar 的标准实现,因为在 api 8 中,设备有一个菜单按钮,这是标准。它有助于使平台保持标准(无论这是否是旧标准)。

    【讨论】:

    • 感谢您的回答,但我的 api 17 设备也有菜单按钮,是银河 1。问题不在于菜单按钮或溢出操作按钮,问题在于布局。我想要像 api 11> 这样的列表,而不是像旧 api 这样的菜单方块...
    • 这就是他们决定实现 ActionBar 支持库(Sherlock 和支持库)的方式,以便应用程序保持其平台预期的功能。除非您实现自己的操作栏并自己实现PopupMenus,否则不会有简单的解决方案。
    • 您可以在技术上这样做hackery并使用现有的ActionBar库实现手动溢出项,单击时您会在溢出项图标(右上角)下显示PopupMenu
    • 但是action bar sherlock有菜单溢出支持,见下图:wptrafficanalyzer.in/blog/wp-content/uploads/2012/07/….
    • 不适用于旧设备,请参阅 groups.google.com/forum/#!topic/actionbarsherlock/6bx3aIbSUZg 后来 ForceOverflow 被删除:stackoverflow.com/questions/13179620/…
    【解决方案2】:

    经过长时间的搜索似乎没有解决方案,因为Android支持库和Sherlock库将使用旧设备上的旧菜单,如J.Romero所说。所以我做到了,我从ActionBarSherlock 创建了一个分支,我使用基于ActionBarSherlock 版本4.1.0 的自定义版本并使用主题“@style/Theme.Sherlock.[ANY].ForceOverflow”,在我的案例“@style/Theme.Sherlock.Light.DarkActionBar.ForceOverflow”。就这样,完美运行。

    详细点,我不建议使用我的版本,因为它不支持任何已解决的错误或ActionBarSherlock 版本4.2.0 或更高版本的新功能将不会显示在那里!

    here my fork

    并在解决方案后发出新的屏幕截图:D

    API 8:

    API 17:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多