创建android动作栏 - 如何?

时间:2014-03-28 21:40:58

标签: android xml android-layout android-actionbar

我知道这个问题非常蹩脚,但我在这里遇到了困难。我是Android的新手,我正在尝试按照谷歌的教程创建一个操作栏:

  1. http://developer.android.com/design/patterns/actionbar.html
  2. http://developer.android.com/training/basics/actionbar/adding-buttons.html
  3. 但我已经被困在这里好几个小时了。

    我的应用程序有一个登录界面,它将触发主屏幕,在这个主屏幕中,我将有我的操作栏。我已经尝试了很多组合来使这个动作栏出现但没有任何用处。

    我尝试过的一件事,简单地添加这个xml源来查看我的布局:

        <menu xmlns:android="http://schemas.android.com/apk/res/android" >
            <!-- Search, should appear as action button -->
            <item android:id="@+id/action_search"
                  android:icon="@drawable/ic_action_search"
                  android:title="@string/action_search"
                  android:showAsAction="ifRoom" />
            <!-- Settings, should always be in the overflow -->
            <item android:id="@+id/action_settings"
                  android:title="@string/action_settings"
                  android:showAsAction="never" />
        </menu>
    

    当我这样做并进入图形布局进行检查时,它会给我这样的信息:

        "<menu>" does not set the required layout_width attribute:
         (1) Set to "wrap_content"
         (2) Set to "match_parent"
    
            "<menu>" does not set the required layout_height attribute:
             (1) Set to "wrap_content"
             (2) Set to "match_parent"
            "action_search" does not set the required layout_width attribute:
             (1) Set to "wrap_content"
             (2) Set to "match_parent"
            "action_search" does not set the required layout_height attribute:
             (1) Set to "wrap_content"
             (2) Set to "match_parent"
            "action_settings" does not set the required layout_width attribute:
             (1) Set to "wrap_content"
             (2) Set to "match_parent"
            "action_settings" does not set the required layout_height attribute:
             (1) Set to "wrap_content"
             (2) Set to "match_parent"
            Exception raised during rendering: com.android.layoutlib.bridge.MockView cannot be cast to android.view.ViewGroup
            You must supply a layout_width attribute.
            You must supply a layout_height attribute.
    

    如果我设置了布局内容,则下一条错误消息为:

    Exception raised during rendering: com.android.layoutlib.bridge.MockView cannot be cast to android.view.ViewGroup
    

    它不能以某种方式呈现布局......我也尝试在菜单外设置一个相对或线性布局,如下所示:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/background" >
    
        <menu xmlns:android="http://schemas.android.com/apk/res/android" >
        <!-- Search, should appear as action button -->
        <item android:id="@+id/action_search"
              android:icon="@drawable/ic_action_search"
              android:title="@string/action_search"
              android:showAsAction="ifRoom" />
        <!-- Settings, should always be in the overflow -->
        <item android:id="@+id/action_settings"
              android:title="@string/action_settings"
              android:showAsAction="never" />
        </menu>
    
    </RelativeLayout>
    

    但这样我收到了:

    Unexpected namespace prefix “xmlns” found for tag Menu
    

    也;我试图从res / layout文件夹中删除我的.xml,并将他留在另一个res / menu文件夹中...只有google提供的.xml;这样我就不会出现语法错误,但是当主屏幕意图导致应用程序崩溃时,我无法再使用图形布局和这种或那种方式。

    所以请问,我到底错过了什么?

2 个答案:

答案 0 :(得分:1)

菜单xml不是布局xml的一部分。它是菜单文件夹中的单独xml文件,在运行时使用以下代码添加:

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
  // Inflate the menu items for use in the action bar
  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.main_activity_actions, menu);
  return super.onCreateOptionsMenu(menu);
}

然后要回复菜单xml中的各个项目,请使用以下代码:

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
  // Handle presses on the action bar items
  switch (item.getItemId()) 
  {
      case R.id.action_search:
          openSearch();
          return true;
      case R.id.action_settings:
          openSettings();
          return true;
      default:
          return super.onOptionsItemSelected(item);
  }
}

如果您想支持Android 2.1及更高版本,请使用此建议 - http://developer.android.com/training/basics/actionbar/setting-up.html#ApiLevel7

答案 1 :(得分:1)

这个答案是基于samleighton87的答案,我建议他编辑他的帖子,但他在stackoverflow上并不那么活跃;因此,根据他的回答,我会给出另一个答案并进行一些修正,以便在遇到问题时澄清我的观点:

查看本教程:https://www.youtube.com/watch?v=iA2Efmo2PCA

一开始你会看到需要做什么以及你缺少什么。

您需要在.xml文件后面创建res / menu文件夹,并使用google在main_activity_actions.xml提供的代码;在此之后,请确保在您的活动.java文件中包含此方法:

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
  // Inflate the menu items for use in the action bar
  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.main_activity_actions, menu);
  return super.onCreateOptionsMenu(menu);
}

此.java文件中的主类将扩展“Activity”。您现在将意识到自动生成的是R.java中的Reference,他(R.java)将能够找到您的res / menu文件夹,允许您使用inflater.inflate(R.menu.main_activity_actions, menu);指向它。请记住:此.xml文件不是布局xml文件的一部分。它是一个 在菜单文件夹中分隔.xml文件,您也将无法使用图形 布局来处理它。

然后要回复菜单xml中的各个项目,请使用以下代码:

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
  // Handle presses on the action bar items
  switch (item.getItemId()) 
  {
      case R.id.action_search:
          openSearch();
          return true;
      case R.id.action_settings:
          openSettings();
          return true;
      default:
          return super.onOptionsItemSelected(item);
  }
}

如果您想支持Android 2.1及更高版本,请使用此建议检查 - http://developer.android.com/training/basics/actionbar/setting-up.html#ApiLevel7

再次感谢samleighton87

欢呼声