麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統(tǒng) > Android > 正文

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

2020-04-11 12:32:48
字體:
供稿:網(wǎng)友

     Android SDK本身提供了一種默認(rèn)創(chuàng)建菜單的機(jī)制。但通過這種機(jī)制創(chuàng)建的菜單雖然從功能上很完備,但在界面效果上實(shí)在是有點(diǎn)“土”。對(duì)于一個(gè)擁有絢麗界面的程序配上一個(gè)有點(diǎn)“土”的菜單,會(huì)使用戶感覺很怪,甚至?xí)菇k麗的界面大打折扣。實(shí)際上,對(duì)于如此靈活和強(qiáng)大的Android系統(tǒng),修改菜單的樣式只是小菜一碟。為程序加入漂亮菜單的方法很多。在本節(jié)先介紹一種比較常用的方法,就是通過onKeyDown事件方法和PopupWindow實(shí)現(xiàn)自定義的菜單。至于通過這種技術(shù)能否設(shè)計(jì)出絢麗的菜單效果,那就要看我們的設(shè) 計(jì)、美學(xué)、心理學(xué)功底了。

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



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

復(fù)制代碼 代碼如下:

<?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">
<!-- 第一個(gè)菜單項(xiàng):“首頁” -->
<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>
<!-- 第二個(gè)菜單項(xiàng):“我的” -->
<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>
<!-- 第三個(gè)菜單項(xiàng)
<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>


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

下面來編寫監(jiān)聽“menu”和“back”鍵按下動(dòng)作的代碼。按下“back”鍵要處理的任務(wù)有如下兩個(gè)。

如果選項(xiàng)菜單已經(jīng)彈出,關(guān)閉選項(xiàng)菜單。如果選項(xiàng)菜單未彈出,或已經(jīng)被關(guān)閉,直接關(guān)閉當(dāng)前的Activity,也就是調(diào)用finish方法。

為了區(qū)分上面兩個(gè)任務(wù),在程序中設(shè)置了一個(gè)int類型狀態(tài)變量(state),當(dāng)state為1時(shí)表示選項(xiàng)菜單已彈出,state為2時(shí)表示選項(xiàng)菜單未彈出。下面我們看一下完整的實(shí)現(xiàn)代碼。

復(fù)制代碼 代碼如下:

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; //狀態(tài)變量,1:選項(xiàng)菜單已彈出,2:選項(xiàng)菜單未彈出
@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”鍵的動(dòng)作
// 選項(xiàng)菜單已彈出,不再彈出新的窗口
if (state == 1)
return false;
// 裝載選項(xiàng)菜單布局文件
layout =getLayoutInflater().inflate(R.layout.menu_layout, null);
// 創(chuàng)建PopupWindow對(duì)象,并在指定位置彈出用于顯示菜單的窗口
pop = new PopupWindow(layout,getWindowManager()
.getDefaultDisplay().getWidth(), getWindowManager()
.getDefaultDisplay().getHeight());
// 設(shè)置彈出窗口的位置
pop.showAtLocation(layout,Gravity.BOTTOM, 0, 0);
View home = layout.findViewById(R.id.home);
// 為“首頁”菜單項(xiàng)添加單擊事件
home.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View view)
{
Toast.makeText(Main.this, "單擊定制菜單.", Toast.LENGTH_LONG).show();
// 單擊“首頁”菜單項(xiàng)后,關(guān)閉選項(xiàng)菜單
pop.dismiss();
// 重新設(shè)置狀態(tài)變量
state = 2;
}
});
// 彈出選項(xiàng)菜單后,將狀態(tài)變量設(shè)為1,表示選項(xiàng)菜單已彈出
state = 1;
return false;
case KeyEvent.KEYCODE_BACK: // 按下“back”鍵的動(dòng)作
if (state == 1)
{
// 如果選項(xiàng)菜單已彈出,關(guān)閉它
pop.dismiss();
// 將狀態(tài)變量設(shè)為選項(xiàng)菜單已關(guān)閉
state = 2;
}
else if (state == 2)
{
// 如果選項(xiàng)菜單還沒有顯示,或已經(jīng)關(guān)閉,則直接關(guān)閉當(dāng)前的Activity
finish();
}
return false;
}
// 除“menu”和“back”按下事件外,仍需調(diào)用Activity類的onKeyDown方法來響應(yīng)其他鍵的按下事件
return super.onKeyDown(keyCode, event);
}
}

在編寫上面代碼時(shí)應(yīng)注意如下幾點(diǎn)。

對(duì)于選項(xiàng)菜單來說,一般單擊某個(gè)菜單項(xiàng)后,會(huì)執(zhí)行一些動(dòng)作,并且選項(xiàng)菜單會(huì)自動(dòng)關(guān)閉。為了模擬這一過程。為“首頁”菜單項(xiàng)添加了一個(gè)單擊事件。當(dāng)單擊“首頁”菜單項(xiàng)時(shí),會(huì)彈出一個(gè)Toast提示信息,并且選項(xiàng)菜單會(huì)關(guān)閉。 當(dāng)執(zhí)行完按下“menu”或“back”鍵的動(dòng)作后,onKeyDown方法應(yīng)返回一個(gè)常量(false或true都可以),不能再調(diào)用super.onKeyDown方法,否則在執(zhí)行完定制的菜單項(xiàng)動(dòng)作后,又會(huì)執(zhí)行系統(tǒng)的默認(rèn)動(dòng)作。例如,當(dāng)按下“back”鍵后,關(guān)閉彈出菜單后,連當(dāng)前的Activity也一起關(guān)了。當(dāng)然,如果是除了“menu”和“back”的其他鍵按下時(shí)還是需要調(diào)用Activity類的onKeyDown方法的(也就是super.onKeyDown方法),這樣在程序中還可以響應(yīng)其他的按鍵事件,否則程序除了“menu”和“back”鍵外,其他的鍵幾乎都不好使了。showAtLocation方法用于控件彈出窗口的位置。該方法的第1個(gè)參數(shù)是一個(gè)View對(duì)象。實(shí)際上,showAtLocation方法內(nèi)部只是需要調(diào)用View.getWindowToken方法來獲得一個(gè)IBinder對(duì)象。showAtLocation方法的第2個(gè)參數(shù)表示彈出窗口的位置。本例中設(shè)置了彈出窗口在屏幕底部顯示。最后兩個(gè)參數(shù)分別表示水平和垂直偏移量。本例都設(shè)為0,表示不發(fā)生偏移。因此,彈出窗口會(huì)在屏幕的最底部顯示,也就是顯示選項(xiàng)菜單的位置。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 免费a级毛片永久免费 | 久久成人精品视频 | 日本a级一区 | 96视频在线免费观看 | 蜜桃视频在线入口www | 一区二区精品视频在线观看 | 免费中文视频 | 欧美成人精品一区二区 | 91精品国产乱码久久桃 | 欧美视频网 | 91亚洲精品一区二区福利 | 欧美日本一 | 久久精品中文字幕 | 黄色一级片在线观看 | 精品视频 久久久 | 欧美黄 片免费观看 | 国产九色在线播放九色 | 国产精品成人一区二区三区电影毛片 | 成人在线免费视频播放 | 久久毛片免费观看 | 久久久久久久久久久久久久国产 | 一级免费特黄视频 | 欧美福利视频一区二区 | 久久精品视频日本 | 最新中文在线视频 | 99这里精品| 中文字幕亚洲欧美 | 一区二区久久久久草草 | 宅男噜噜噜66国产在线观看 | 黄污网站在线观看 | 国产午夜精品视频免费不卡69堂 | 亚洲成人在线免费 | 特级a欧美做爰片毛片 | 美女毛片儿 | 999精品久久久 | av成人免费 | 羞羞的网站 | 国产精品久久久久久久午夜片 | 久久精品视频69 | 深夜视频在线观看 | 精品一区二区三区在线观看国产 |