2014-03-28 49 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