亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android開發技巧之我的菜單我做主(自定義菜單)

2020-04-11 12:32:48
字體:
來源:轉載
供稿:網友

     Android SDK本身提供了一種默認創建菜單的機制。但通過這種機制創建的菜單雖然從功能上很完備,但在界面效果上實在是有點“土”。對于一個擁有絢麗界面的程序配上一個有點“土”的菜單,會使用戶感覺很怪,甚至會使絢麗的界面大打折扣。實際上,對于如此靈活和強大的Android系統,修改菜單的樣式只是小菜一碟。為程序加入漂亮菜單的方法很多。在本節先介紹一種比較常用的方法,就是通過onKeyDown事件方法和PopupWindow實現自定義的菜單。至于通過這種技術能否設計出絢麗的菜單效果,那就要看我們的設 計、美學、心理學功底了。

     通過6.1.1節介紹的選項菜單可以知道。通過按手機的“Menu”鍵(是手機上的硬按鍵,不同手機“Menu”鍵所在的位置會不同),可以彈出選項菜單,再按“Back”鍵,選項菜單會關閉。那么要想模擬選項菜單的彈出和關閉效果,只需要監聽這兩個鍵的按下事件即可。并且在“Menu”鍵按下時使用PopupWindow彈出一個窗口作為模擬的選項菜單。下面先來看看如圖6.9所示的模擬選項菜單的效果。



從圖6.9可以看出,在界面的下方顯示了3個菜單項:“首頁”、“我的”和“更多”。其中“我的”菜單項的文字和圖像是左右水平排列,而另兩個菜單項上的文字和圖像是上下垂直排列。實際上,這種效果由一個普通的布局文件(menu_layout.xml)完成的,代碼如下:

復制代碼 代碼如下:

<?xml version="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"android:layout_width="fill_parent"
android:layout_height="wrap_content"android:gravity="bottom">
<!-- 第一個菜單項:“首頁” -->
<LinearLayout android:id="@+id/home"android:orientation="vertical"
android:layout_width="fill_parent"android:layout_height="wrap_content"
android:background="@drawable/button_normal_translucent"
android:layout_weight="1">
<ImageView android:layout_width="fill_parent"
android:layout_height="wrap_content"android:src="@drawable/home"
android:paddingTop="5dp" />
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"android:text="首頁"
android:gravity="center" />
</LinearLayout>
<!-- 第二個菜單項:“我的” -->
<LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:background="@drawable/button_normal"android:layout_weight="1"
android:gravity="center">
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:src="@drawable/mine"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="我的" />
</LinearLayout>
<!-- 第三個菜單項
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content" android:background="@drawable/button_normal"
android:layout_weight="1">
<ImageView android:layout_width="fill_parent"
android:layout_height="wrap_content"android:src="@drawable/more"
android:paddingTop="18dp" />
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="更多"
android:gravity="center"android:paddingTop="5dp"/>
</LinearLayout>
</LinearLayout>


在編寫上面代碼之前,別忘了準備幾個相關的圖像,例如,本例使用了5個圖像。其中button_normal_translucent.png用于“首頁”菜單項的背景(半透明效果),button_normal.png用于“我的”和“更多”菜單項的背景。home.png、mine.png和more.png分別用于這三個菜單項的圖像。

下面來編寫監聽“menu”和“back”鍵按下動作的代碼。按下“back”鍵要處理的任務有如下兩個。

如果選項菜單已經彈出,關閉選項菜單。如果選項菜單未彈出,或已經被關閉,直接關閉當前的Activity,也就是調用finish方法。

為了區分上面兩個任務,在程序中設置了一個int類型狀態變量(state),當state為1時表示選項菜單已彈出,state為2時表示選項菜單未彈出。下面我們看一下完整的實現代碼。

復制代碼 代碼如下:

package mobile.android.ch06.custom.menu;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.PopupWindow;
import android.widget.Toast;
public class Main extends Activity
{
privatePopupWindow pop;
privateView layout;
private int state = 2; //狀態變量,1:選項菜單已彈出,2:選項菜單未彈出
@Override
publicvoid onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
publicboolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_MENU: // 按下“menu”鍵的動作
// 選項菜單已彈出,不再彈出新的窗口
if (state == 1)
return false;
// 裝載選項菜單布局文件
layout =getLayoutInflater().inflate(R.layout.menu_layout, null);
// 創建PopupWindow對象,并在指定位置彈出用于顯示菜單的窗口
pop = new PopupWindow(layout,getWindowManager()
.getDefaultDisplay().getWidth(), getWindowManager()
.getDefaultDisplay().getHeight());
// 設置彈出窗口的位置
pop.showAtLocation(layout,Gravity.BOTTOM, 0, 0);
View home = layout.findViewById(R.id.home);
// 為“首頁”菜單項添加單擊事件
home.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View view)
{
Toast.makeText(Main.this, "單擊定制菜單.", Toast.LENGTH_LONG).show();
// 單擊“首頁”菜單項后,關閉選項菜單
pop.dismiss();
// 重新設置狀態變量
state = 2;
}
});
// 彈出選項菜單后,將狀態變量設為1,表示選項菜單已彈出
state = 1;
return false;
case KeyEvent.KEYCODE_BACK: // 按下“back”鍵的動作
if (state == 1)
{
// 如果選項菜單已彈出,關閉它
pop.dismiss();
// 將狀態變量設為選項菜單已關閉
state = 2;
}
else if (state == 2)
{
// 如果選項菜單還沒有顯示,或已經關閉,則直接關閉當前的Activity
finish();
}
return false;
}
// 除“menu”和“back”按下事件外,仍需調用Activity類的onKeyDown方法來響應其他鍵的按下事件
return super.onKeyDown(keyCode, event);
}
}

在編寫上面代碼時應注意如下幾點。

對于選項菜單來說,一般單擊某個菜單項后,會執行一些動作,并且選項菜單會自動關閉。為了模擬這一過程。為“首頁”菜單項添加了一個單擊事件。當單擊“首頁”菜單項時,會彈出一個Toast提示信息,并且選項菜單會關閉。 當執行完按下“menu”或“back”鍵的動作后,onKeyDown方法應返回一個常量(false或true都可以),不能再調用super.onKeyDown方法,否則在執行完定制的菜單項動作后,又會執行系統的默認動作。例如,當按下“back”鍵后,關閉彈出菜單后,連當前的Activity也一起關了。當然,如果是除了“menu”和“back”的其他鍵按下時還是需要調用Activity類的onKeyDown方法的(也就是super.onKeyDown方法),這樣在程序中還可以響應其他的按鍵事件,否則程序除了“menu”和“back”鍵外,其他的鍵幾乎都不好使了。showAtLocation方法用于控件彈出窗口的位置。該方法的第1個參數是一個View對象。實際上,showAtLocation方法內部只是需要調用View.getWindowToken方法來獲得一個IBinder對象。showAtLocation方法的第2個參數表示彈出窗口的位置。本例中設置了彈出窗口在屏幕底部顯示。最后兩個參數分別表示水平和垂直偏移量。本例都設為0,表示不發生偏移。因此,彈出窗口會在屏幕的最底部顯示,也就是顯示選項菜單的位置。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
粗暴蹂躏中文一区二区三区| 亚洲国产另类 国产精品国产免费| 亚洲男人天堂网| 欧美性猛交xxxx| 亚洲国产精品999| 国模gogo一区二区大胆私拍| 欧美在线www| 高清一区二区三区四区五区| 国产亚洲在线播放| 亚洲日本成人女熟在线观看| 久久综合久久八八| 国产精品久久久久久久久久三级| 久久深夜福利免费观看| 久久久久久免费精品| 久久久久久久久久久人体| 欧美日韩国产中文字幕| 国产一区香蕉久久| 中文字幕精品一区久久久久| 97久久精品人人澡人人爽缅北| 亚洲三级av在线| 日韩美女写真福利在线观看| 97热在线精品视频在线观看| 欧美一乱一性一交一视频| 伊人男人综合视频网| 一区二区成人av| 中文字幕久久久| 久久免费在线观看| 久久躁日日躁aaaaxxxx| 色综合久久天天综线观看| 日韩福利在线播放| 91国内免费在线视频| 久久久亚洲影院| 91爱视频在线| 亚洲片在线观看| 久久精品男人天堂| 91亚洲精品一区二区| 精品亚洲夜色av98在线观看| 91精品久久久久| 久久伊人精品视频| 成人激情在线播放| 欧美电影在线观看网站| 久久精品99国产精品酒店日本| 欧美裸体男粗大视频在线观看| 2019精品视频| 性色av一区二区三区| 日韩av不卡在线| 日韩亚洲第一页| 国产欧美一区二区白浆黑人| 亚洲国产第一页| 久久在线免费视频| 国产精品欧美日韩一区二区| 日韩女优人人人人射在线视频| www亚洲欧美| 欧美日韩一二三四五区| 青青草原成人在线视频| 国产精品对白刺激| 97av在线播放| 色综合色综合久久综合频道88| 亚洲国产婷婷香蕉久久久久久| 黄色成人在线免费| 丰满岳妇乱一区二区三区| 国产精品 欧美在线| 欧美大片在线看免费观看| 91精品免费久久久久久久久| 国产午夜精品理论片a级探花| 91精品国产综合久久香蕉922| 538国产精品一区二区在线| 日韩成人xxxx| 午夜精品三级视频福利| 国产精品欧美日韩| 性亚洲最疯狂xxxx高清| 国产丝袜视频一区| 亚洲欧美日韩一区二区在线| 中文字幕在线看视频国产欧美在线看完整| 亚州欧美日韩中文视频| 亚洲视频axxx| 4438全国成人免费| 国产精品国语对白| 亚洲国产日韩欧美在线动漫| 久久好看免费视频| 97在线观看免费| 日韩精品极品在线观看| 性色av一区二区三区| 成人性生交大片免费观看嘿嘿视频| 亚洲天堂av综合网| 国产成人在线一区二区| 91免费精品视频| 欧美日本高清视频| 欧美大片在线看| 91av在线国产| 97视频在线观看成人| 精品国产精品三级精品av网址| 欧美亚洲视频在线观看| 欧美日韩在线视频一区二区| 成人精品久久av网站| 国产精品美女主播| 中文字幕国产精品久久| 亚洲国产精品va在看黑人| 日本乱人伦a精品| 在线观看久久av| 午夜免费日韩视频| 欧美成人h版在线观看| 国产精品视频1区| 国产精品国模在线| 色爱精品视频一区| 色婷婷av一区二区三区久久| 久久久久久国产精品久久| 国产精品91在线观看| 亚洲人成亚洲人成在线观看| 久久精品视频在线观看| 性欧美视频videos6一9| 国产精品午夜视频| 亚洲视频欧洲视频| 国产免费成人av| 国产91精品久久久久久久| 91香蕉电影院| 亚洲欧美中文日韩在线v日本| 国产精品久久久久aaaa九色| 午夜美女久久久久爽久久| 欧美国产日韩一区| 亚洲国产精品电影在线观看| 亚洲第一精品电影| 国产日韩欧美在线| 亚洲成人免费在线视频| 亚洲欧美日韩精品久久| 国产亚洲精品激情久久| 91亚洲午夜在线| 久久91亚洲精品中文字幕| 亚洲欧美成人在线| 97在线视频免费播放| 亚洲图中文字幕| 日本精品一区二区三区在线播放视频| 亚洲日韩欧美视频一区| 欧美色道久久88综合亚洲精品| 国产综合在线观看视频| 欧美成人三级视频网站| 在线午夜精品自拍| 九九久久综合网站| 国产欧亚日韩视频| 一区三区二区视频| 久久91亚洲人成电影网站| 精品久久久久久久中文字幕| 国产亚洲精品久久久优势| 欧美激情视频给我| 精品国产依人香蕉在线精品| 欧美午夜影院在线视频| 欧美大片在线影院| 国产精品影院在线观看| 国产精品尤物福利片在线观看| 97精品久久久中文字幕免费| 日韩中文在线视频| 欧美日韩国产中文精品字幕自在自线| 亚洲亚裔videos黑人hd| 日韩欧美高清在线视频| 欧美日韩国产二区| 欧美久久精品一级黑人c片| 亚洲xxxx妇黄裸体| 日韩在线中文视频| 国产精品电影久久久久电影网| 一区二区三区四区在线观看视频| 青草热久免费精品视频| 亚洲国产一区二区三区四区| 自拍偷拍亚洲一区| 欧美精品手机在线|