安卓ActionBarSherlock顶部栏

5

enter image description here

我想要一个像foursquare一样的操作栏。我想要的是像好友,探索和我这样的选项卡。此外,在选项卡上方,我想要一个自定义布局,其中包括一些按钮,例如在foursquare中的foursquare logo、刷新和签到。我创建了选项卡,但我无法改变ActionBarSherlock中选项卡上方的布局。我该如何解决这个问题?


你能提供一下Foursquare应用的截图吗? - karllindmark
我添加了Foursquare的PS。 - BCK
我非常确定他们使用了个人实现的工具栏,而不是使用ActionBarSherlock。 - Ovidiu Latcu
@OvidiuLatcu 你可能是对的,但你知道我如何使用ActionBarSherlock在选项卡上方添加自定义布局吗? - BCK
2个回答

7
要实现Foursquare的外观,您无需考虑在选项卡上方创建布局。使用Actionbar Sherlock时,您只需要关注以下几点:
  1. 为顶部栏制作背景
  2. 为顶部栏制作标志
  3. 在menu.xml文件中添加项目,ActionbarSherlock将使用它们来填充顶部区域的按钮(只要将使用Actionbar Sherlock样式的样式附加到该活动中)。
因此,对于1和2,重点是使用styles.xml文件(应位于res文件夹中的值文件夹中),如下所示:
<style name="Theme.Example" parent="Theme.Sherlock">
    <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
    <item name="absForceOverflow">true</item>       
</style>

<style name="Widget.Styled.ActionBar" parent="Widget.Sherlock.ActionBar.Solid">
    <item name="background">@drawable/actionbar_background</item> <-- the background for top bar
    <item name="icon">@drawable/actionbar_logo</item> <-- the logo that goes top left in the top bar
    <item name="backgroundSplit">@drawable/bg_striped_split</item> <-- the image used between the menu items
</style>

对于第三步,您需要在menu.xml下创建菜单项(应该位于菜单文件夹中(如果没有,请在res文件夹中创建一个)):

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">     

<item android:id="@+id/menu_prefs"
      android:icon="@drawable/settings_icon"
      android:title="Preferences"
      android:showAsAction="ifRoom" /> 
</menu>

要查看菜单项的最后一步是在活动中使用这些函数:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return true;
}

public boolean onOptionsItemSelected (MenuItem item) {

    Intent intent;

    switch (item.getItemId())
    {   
    case R.id.menu_prefs:

        // Launch Preference Activity
        intent = new Intent(getBaseContext(), Preferences.class);           
        startActivity(intent);
        break;
    }

    return false;
}

还有一个问题,由于你的代码,我想在点击menu_prefs时拥有ListNavigation或ActionMode。另外,还有一个选项卡。我该如何处理这个问题? - BCK
@Richard Lewin - 使用上述示例时,“蓝色”顶部导航出现在我的选项卡下面 - 有什么想法,如何将其置于上方?此外,当横向排列时,顶部栏会折叠到选项卡中 - 有没有办法强制它保持在顶部? - bMon
顶部栏折叠是默认的操作栏行为,因此不应该(也不可能)被更改。栏出现在选项卡下方的问题很不寻常,因为选项卡应该在导航栏下方,并且应该折叠到导航栏中。提供正在发生的情况的屏幕截图将非常有帮助。您能通过 Stack Overflow 将其发送给我吗? - Richard Lewin
@RichardLewin 没问题,这里是链接:http://stackoverflow.com/questions/12356422/tabs-with-actionbarsherlock-and-fragments-with-top-nav-bar 谢谢。 - bMon

3
要设置自定义操作项目(刷新、签入等),您需要覆盖onCreateOptionsMenu(Menu menu)并设置自定义菜单。

例如:

文件菜单/my_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/refresh"
        android:icon="@drawable/ic_menu_refresh"
        android:title="refresh"
        android:showAsAction="always">
    </item>

</menu>

然后在您的活动(或片段)中:

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

  // Allow activity and fragments to add items
  super.onCreateOptionsMenu(menu);

  return true;
}

而要在它们被选中时得到通知,只需覆盖onOptionsItemSelected(MenuItem item)方法:

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
  switch (item.getItemId())
  {
    case android.R.id.refresh :
      // refresh your data...
      return true;

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

@Chinaski - 和上述相同:当使用上面的示例时,“蓝色”顶部导航出现在我的选项卡下方--有什么想法,如何将其放置在上方?此外,当横向排列时,顶部栏会折叠到选项卡中 - 有没有办法强制其保持在顶部? - bMon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接