android 自定義menu及 Error parsing XML: no element found問題解答

今晚在做應用程序時,需要用到 Menu。左思右想還是決定編寫 menu.xml 的方式來完成,這樣做的好處:1、方便管理(這也正是android應用xml的原因之一);2、便於修改。在 Android 中任何視圖組件的創建方式都有兩種:1、在XML文件中創建;2、在代碼中創建。Menu 也不例外,我們既可以在資源文件中聲明,也可以在代碼中創建。

Android 中的菜單分爲:1、選項菜單 ,2、上下文菜單和子菜單,都可以在XML文件中聲明定義,在代碼中通過MenuInflater 類來使用。本節主要講 Menu 在 XML 中的定義以及在程序中的應用。

一、 Menu 資源文件的定義

Menu 資源文件也是一個XML文件,該文件存放於工程的res\menu\menu.xml 目錄下。通過R.menu.menu的方式來引用。

Menu 資源文件的結構:

1、<menu>根元素,在<menu>根元素裏面會嵌套<item><group>子元素,<menu>根元素沒有屬性。

2、<item>元素中也可嵌套<menu>形成子菜單。

3、<group>表示一個菜單組,相同的菜單組可以一起設置其屬性,例如visibleenabledcheckable等。<group>元素的屬性說明如下:

id:唯一標示該菜單組的引用id

menuCategory:對菜單進行分類,定義菜單的優先級,有效值爲containersystemsecondaryalternative

orderInCategory:一個分類排序整數。

checkableBehavior:選擇行爲,單選、多選還是其他。有效值爲noneallsingle

visible:是否可見,true或者false

enabled:是否可用,true或者false


<item>表示菜單項,包含在<menu><group>中的有效屬性。<item>元素的屬性說明如下。

id:唯一標示菜單的ID引用。

menuCategory:菜單分類。

orderInCategory:分類排序。

title:菜單標題字符串。

titleCondensed:濃縮標題,適合標題太長的時候使用。

icon:菜單的圖標。

alphabeticShortcut:字符快捷鍵。

numericShortcut:數字快捷鍵。

checkable:是否可選。

checked:是否已經被選。

visible:是否可見。

enabled:是否可用。

二、Menu 在程序中的應用

在定義了 Menu 後,接下來就是在程序中去應用它,方法如下:
@Override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu);
}

下面來個實例:
1、定義Menu 文件(
res\menu\blacklist.xml):
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="File" android:icon="@drawable/icon">
<menu>
<group android:id="@+id/noncheckable_group"
android:checkableBehavior="none">
<item android:id="@+id/newFile" android:title="New"
android:alphabeticShortcut="n" />
<item android:id="@+id/openFile" android:title="Open"
android:alphabeticShortcut="o" />
<item android:id="@+id/saveFile" android:title="Save"
android:alphabeticShortcut="s" />
</group>
</menu>
</item>

<item android:title="Edit" android:icon="@drawable/icon">
<menu>
<group android:id="@+id/edit_group" android:checkableBehavior="single">
<item android:id="@+id/cut" android:title="Cut" android:checked="true"/>
<item android:id="@+id/copy" android:title="Copy" />
<item android:id="@+id/past" android:title="Past" />
</group>
</menu>
</item>

<item android:title="Help" android:icon="@drawable/icon">
<menu>
<group android:id="@+id/help_group">
<item android:id="@+id/about" android:title="About" />
<item android:id="@+id/exit" android:title="Exit" />
</group>
</menu>
</item>
</menu>

2、程序中應用:
@Override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.blacklist, menu);
return super.onCreateOptionsMenu(menu);
}
以上來自:http://blog.163.com/ybxu-123/blog/static/594737702010680575834/

但是我按照上面的做法做完後,發現在項目有錯誤,但是所有的src,res文件夾中都沒有錯誤。然後按照下面的做法成功的run了。

在Eclipse平臺進行Android 應用開發時,編輯,修改或增刪 res/下資源文件時有時會遇到如下錯誤提示:“Unparsed aapt error(s)! Check the console for output",因爲它沒有描述錯誤在什麼地方,我不知道如何修正,於是百度找找,其中不少的文章都說:
”可檢查控制檯輸出的提示來解決。
比如在res/layout下新加了一個xml文件: NewScreen.xml, 這時就會遇到上述錯誤提示, 控制檯會有類似如下提示:
the layout file name can only contain characters in [a- z0-9] etc.
即layout 文件名只能在小寫的26個字母和數字0~9中選取. 因此,我們的文件名中有大寫字母就會報錯.
有時如果錯誤提示不清楚, 可以把R.java刪掉使其重新生成. 可以不直接刪, 把res下的某個文件刪去(先備份一下), R.java即會重新更新.“

我嘗試多次去重命名剛纔新增加的xml文件,甚至刪除R.java文件,還是無濟於事!後來看到了另一個方法:
”但是你的控制檯上找不到錯誤或者看不懂錯誤的時候的一招。
例:出現
[2010-03-29 10:02:47 - Sudoku] W/ResourceType( 3540): Bad XML block: header size 62 or total size 26129448 is larger than data size 0
[2010-03-29 10:02:47 - Sudoku] E:\workspace\Sudoku\res\menu\menu.xml:2: ERROR Error parsing XML: no element found
[2010-03-29 10:04:55 - Sudoku] W/ResourceType( 4892): Bad XML block: header size 62 or total size 0 is larger than data size 0
以上錯誤的時候, 點 Project--------->clean..就會沒問題

照着做,真的沒事了!

以上來自:http://samlee820820.blog.163.com/blog/static/1307913682010835357727/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章