2014-03-28 20 views
0

我知道这个问题很蹩脚,但我真的在这里遇到困难。我是新来的Android和我试图效仿谷歌的教程创建一个操作栏:创建android动作栏 - 如何?

  1. http://developer.android.com/training/basics/actionbar/adding-buttons.html

但我一直困在这里小时。

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

一个我试过的事情,简单的添加这个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 

它不能仁德R上的布局莫名其妙。我已经试过还设置一个相对或线性布局外菜单,就像这样:

<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文件夹;这样我就不会出现语法错误,但当主屏幕意图抛出应用程序崩溃时,我无法再使用图形布局和其他方式。

所以请,我在这里错过了什么?

回答

1

这个答案是基于samleighton87答案,我提出了一个建议,他编辑他的帖子,但他没有这么积极在stackoverflow;因此,基于他的回答,我给了一些修正另一个答案阐明我的观点,当我有问题:

看看这个教程:https://www.youtube.com/watch?v=iA2Efmo2PCA

权一开始你会看到什么需要被完成,你失踪了。

您需要创建res/menu文件夹并在其后。xml文件,代码由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文件内的主类将扩展“活动”。你现在会意识到,自动生成的是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

欢呼声

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