国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

詳解Android之用PopupWindow實現(xiàn)彈出菜單的方法

2020-02-21 17:29:20
字體:
供稿:網(wǎng)友

使用UCWeb瀏覽器時,您會發(fā)現(xiàn)其彈出菜單與系統(tǒng)自帶的菜單不同,它實現(xiàn)了更多菜單選項的顯示,其實通過適配器轉(zhuǎn)換可以很容易地實現(xiàn)菜單選項視圖的切換,下面是武林技術(shù)頻道小編帶給大家詳解Android之用PopupWindow實現(xiàn)彈出菜單的方法。


點擊下載該實例:
一、運行截圖:

?

?

?

二、實現(xiàn)要點:
(1)屏蔽系統(tǒng)彈出的菜單:
1、首先創(chuàng)建至少一個系統(tǒng)的菜單選項

?

@Override
?public boolean onCreateOptionsMenu(Menu menu) {

??menu.add("menu");
??return super.onCreateOptionsMenu(menu);
?}


2、在onMenuOpened方法里顯示自己的菜單視圖,并返回FALSE。

?

?

?


@Override
?public boolean onMenuOpened(int featureId, Menu menu) {
??myMenu.showAtLocation(findViewById(R.id.layout), Gravity.BOTTOM, 0,0);

??return false;?// true--顯示系統(tǒng)自帶菜單;false--不顯示。
?}


(2)點擊菜單欄,切換菜單視圖時,只要重新設(shè)置當(dāng)前的適配器對象就可以。

?

?

?


gv_body.setAdapter(bodyAdapter[arg2]);?//改變選項視圖


(3)繼承PopupWindow,重寫一個類實現(xiàn)彈出對話框,主要是為了更好更簡便實現(xiàn)彈出菜單的樣式和事件響應(yīng)等等。

?

?

?


public class MyDefinedMenu extends PopupWindow { 。。。}


三、 具體代碼如下:
(1)布局:

?

?

?


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
?android:id="@+id/layout"
??? android:orientation="vertical"
??? android:layout_width="fill_parent"
??? android:layout_height="fill_parent"
??? >
</LinearLayout>


(2)程序代碼
1、主類:MyMenu

?

?

?


package com.myandroid.test;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Toast;
public class MyMenu extends Activity {
?private List<String> titles;?//標題欄
?private List<List<String>> item_names;?//選項名稱
?private List<List<Integer>> item_images;?//選項圖標
?private MyDefinedMenu myMenu;?//彈出菜單

?
??? /** Called when the activity is first created. */
??? @Override
??? public void onCreate(Bundle savedInstanceState) {
??????? super.onCreate(savedInstanceState);
??????? setContentView(R.layout.main);

??????? //彈出菜單標題欄
??????? titles = addItems(new String[]{"菜單一", "菜單二", "菜單三"});
??????? //選項圖標
??????? item_images = new ArrayList<List<Integer>>();
??????? item_images.add(addItems(new Integer[]{R.drawable.bag,
??????? ?R.drawable.bluetooth, R.drawable.earth, R.drawable.email}));
??????? item_images.add(addItems(new Integer[]{R.drawable.map,
??????????? ?R.drawable.news, R.drawable.reader, R.drawable.sound, R.drawable.tape}));
??????? item_images.add( addItems(new Integer[]{R.drawable.telephone,
??????????? ?R.drawable.bluetooth, R.drawable.earth, R.drawable.email}));
??????? //選項名稱
??????? item_names = new ArrayList<List<String>>();
??????? item_names.add(addItems(new String[]{"購物", "藍牙", "游覽器", "郵件"}));
??????? item_names.add(addItems(new String[]{"地圖", "新聞", "閱讀器", "音箱", "錄音"}));
??????? item_names.add(addItems(new String[]{"電話", "藍牙", "閱讀器", "郵箱"}));
??????? //創(chuàng)建彈出菜單對象
??myMenu = new MyDefinedMenu(this, titles, item_names,
????item_images, new ItemClickEvent());

??? }

??? /**
???? * 轉(zhuǎn)換為List<String>
???? * @param values
???? * @return
???? */
??? private List<String> addItems(String[] values) {

??? ?List<String> list = new ArrayList<String>();
??? ?for (String var : values) {
???list.add(var);
??}

??? ?return list;
??? }

??? /**
???? * 轉(zhuǎn)換為List<Integer>
???? * @param values
???? * @return
???? */
??? private List<Integer> addItems(Integer[] values) {

??? ?List<Integer> list = new ArrayList<Integer>();
??? ?for (Integer var : values) {
???list.add(var);
??}

??? ?return list;
??? }

?@Override
?public boolean onCreateOptionsMenu(Menu menu) {

??menu.add("menu");
??return super.onCreateOptionsMenu(menu);
?}
?@Override
?public boolean onMenuOpened(int featureId, Menu menu) {
??myMenu.showAtLocation(findViewById(R.id.layout), Gravity.BOTTOM, 0,0);

??return false;?// true--顯示系統(tǒng)自帶菜單;false--不顯示。
?}

?/**
? * 菜單選項點擊事件
? * @author Kobi
? *
? */
?class ItemClickEvent implements OnItemClickListener {
??@Override
??public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
????long arg3) {
???//顯示點擊的是哪個菜單哪個選項。
???Toast.makeText(MyMenu.this, "Menu: " +
?????titles.get(myMenu.getTitleIndex()) +
?????" Item: " + item_names.get(myMenu.getTitleIndex()).get(arg2),
?????Toast.LENGTH_SHORT).show();
???myMenu.dismiss();?//菜單消失
??}

?}?
}


2、彈出菜單類:MyDefinedMenu、

?

?

?


package com.myandroid.test;
import java.util.List;
import com.myandroid.test.MyMenu.ItemClickEvent;
import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
public class MyDefinedMenu extends PopupWindow {

?private LinearLayout layout;?//總的布局
?private GridView gv_title;??//菜單欄
?private GridView gv_body;??//選項視圖
?private BodyAdatper[] bodyAdapter;?//選項適配器
?private TitleAdatper titleAdapter;?//標題適配器
?private Context context;???//上下文
?private int titleIndex;????//菜單序號

?

?public MyDefinedMenu(Context context, List<String> titles,
???List<List<String>> item_names, List<List<Integer>> item_images,
???ItemClickEvent itemClickEvent) {

??super(context);
??this.context = context;

??//布局框架
??layout = new LinearLayout(context);??
??layout.setOrientation(LinearLayout.VERTICAL);
??layout.setLayoutParams(new LayoutParams(
????LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

??//菜單欄
???? titleIndex = 0;
??gv_title = new GridView(context);
??titleAdapter = new TitleAdatper(context, titles);
??gv_title.setAdapter(titleAdapter);
??gv_title.setLayoutParams(new LayoutParams(
????LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
??gv_title.setNumColumns(titles.size());?//菜單個數(shù)
??gv_title.setBackgroundColor(Color.WHITE);

??//選項視圖
??bodyAdapter = new BodyAdatper[item_names.size()];?//各個視圖適配器
??for (int i = 0; i < item_names.size(); i++) {
???bodyAdapter[i] = new BodyAdatper(context, item_names.get(i), item_images.get(i));
??}
??gv_body = new GridView(context);
??gv_body.setNumColumns(4);?//每行顯示4個選項
??gv_body.setBackgroundColor(Color.TRANSPARENT);
??gv_body.setAdapter(bodyAdapter[0]);?//設(shè)置適配器

??//菜單項切換
??gv_title.setOnItemClickListener(new OnItemClickListener() {
???@Override
???public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
?????long arg3) {
????titleIndex = arg2;?//記錄當(dāng)前選中菜單項序號
????titleAdapter.setFocus(arg2);
????gv_body.setAdapter(bodyAdapter[arg2]);?//改變選項視圖
???}
??});

??//設(shè)置選項點擊事件
??gv_body.setOnItemClickListener(itemClickEvent);

??//添加標題欄和選項
??layout.addView(gv_title);
??layout.addView(gv_body);

??// 添加菜單視圖
??this.setContentView(layout);
??this.setWidth(LayoutParams.FILL_PARENT);
??this.setHeight(LayoutParams.WRAP_CONTENT);
??this.setFocusable(true);// menu菜單獲得焦點 如果沒有獲得焦點menu菜單中的控件事件無法響應(yīng)?

?}

?/**
? * 獲取當(dāng)前選中菜單項
? * @return?菜單項序號
? */
?public int getTitleIndex() {

??return titleIndex;
?}

}


?3、菜單欄適配器:TitleAdatper

?

?

?


package com.myandroid.test;
import java.util.List;
import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.TextView;
public class TitleAdatper extends BaseAdapter {
?private List<String> titles;
?private Context context;
?private final TextView[] tv_titels;

?
?public TitleAdatper(Context context, List<String> titles) {
??this.context = context;
??this.titles = titles;
??tv_titels = new TextView[titles.size()];
?}
?@Override
?public int getCount() {
??// TODO Auto-generated method stub
??return titles.size();
?}
?@Override
?public Object getItem(int position) {
??// TODO Auto-generated method stub
??return position;
?}
?@Override
?public long getItemId(int position) {
??// TODO Auto-generated method stub
??return position;
?}

?/**
? * 選中后,改變菜單顏色。
? * @param position
? */
?public void setFocus(int position) {

??for (int i = 0; i < titles.size(); i++) {

???tv_titels[i].setBackgroundColor(Color.WHITE);
??}

??tv_titels[position].setBackgroundColor(Color.BLUE);

?}
?@Override
?public View getView(int position, View convertView, ViewGroup parent) {
??//菜單欄文字項
??tv_titels[position] = new TextView(context);
??tv_titels[position].setGravity(Gravity.CENTER);
??tv_titels[position].setText(titles.get(position));
??tv_titels[position].setTextSize(18);
??tv_titels[position].setLayoutParams(new GridView.LayoutParams(
????LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

??return tv_titels[position];
?}
}


?4、菜單項視圖適配器:BodyAdatper

?

?

?


package com.myandroid.test;
import java.util.List;
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class BodyAdatper extends BaseAdapter {

?private List<String> item_names;
?private List<Integer> item_images;
?private Context context;

?
?public BodyAdatper(Context context, List<String> item_names,
???List<Integer> item_images) {
??this.context = context;
??this.item_names = item_names;
??this.item_images = item_images;
?}
?@Override
?public int getCount() {
??// TODO Auto-generated method stub
??return item_images.size();
?}
?@Override
?public Object getItem(int position) {
??// TODO Auto-generated method stub
??return position;
?}
?@Override
?public long getItemId(int position) {
??// TODO Auto-generated method stub
??return position;
?}

?@Override
?public View getView(int position, View convertView, ViewGroup parent) {
??//總布局
??LinearLayout layout = new LinearLayout(context);
??layout.setOrientation(LinearLayout.VERTICAL);
??layout.setGravity(Gravity.CENTER);
??//選項名稱
??TextView tv_item = new TextView(context);
??tv_item.setGravity(Gravity.CENTER);
??tv_item.setLayoutParams(new GridView.LayoutParams(
????LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
??tv_item.setText(item_names.get(position));
??//選項圖表
??ImageView img_item = new ImageView(context);
??img_item.setLayoutParams(new LayoutParams(50, 50));
??img_item.setImageResource(item_images.get(position));
??//添加選項圖標和名字
??layout.addView(img_item);
??layout.addView(tv_item);

??return layout;
?}
}


這里是用PopupWindow實現(xiàn),當(dāng)然也可以用AlertDialog或者其他自定義對話框等等,也可以改寫Menu,還可以用Tab實現(xiàn)。實現(xiàn)的方法很多,但原理是相同的,例如用兩個GridView,一個作為菜單欄,一個作為菜單項視圖。

上文是武林技術(shù)頻道小編為大家介紹的詳解Android之用PopupWindow實現(xiàn)彈出菜單的方法,希望對你有幫助,也希望大家能一如既往的支持武林技術(shù)頻道!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 德惠市| 阿克| 容城县| 南昌县| 望奎县| 甘泉县| 永福县| 峨山| 武川县| 安宁市| 岑溪市| 监利县| 蒙城县| 壶关县| 北辰区| 福泉市| 正阳县| 湖州市| 柘城县| 阿勒泰市| 明溪县| 重庆市| 武乡县| 龙胜| 晋城| 托克逊县| 德庆县| 桐柏县| 久治县| 信宜市| 通州市| 玉树县| 常山县| 吴旗县| 平果县| 兴宁市| 梧州市| 习水县| 永靖县| 射洪县| 五原县|