1. 程式人生 > >android利用PopupWindow實現點選工具欄彈出下拉選單

android利用PopupWindow實現點選工具欄彈出下拉選單

package com.example.dropdownmenu;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.drawable.ColorDrawable;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class MainActivity extends Activity {

	// 工具欄
	private RelativeLayout rlTopBar;

	// 左中右三個控制元件(工具欄裡)
	private TextView tvLeft;
	private TextView tvRight;
	private TextView tvMiddle;

	// 左中右三個彈出視窗
	private PopupWindow popLeft;
	private PopupWindow popRight;
	private PopupWindow popMiddle;

	// 左中右三個layout
	private View layoutLeft;
	private View layoutRight;
	private View layoutMiddle;

	// 左中右三個ListView控制元件(彈出窗口裡)
	private ListView menulistLeft;
	private ListView menulistRight;
	private ListView menulistMiddle;

	// 選單資料項
	private List<Map<String, String>> listLeft;
	private List<Map<String, String>> listRight;
	private List<Map<String, String>> listMiddle;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		initParam();
	}

	private void initParam() {
		rlTopBar = (RelativeLayout) this.findViewById(R.id.rl_topbar);

		tvLeft = (TextView) this.findViewById(R.id.tv_left);
		tvLeft.setOnClickListener(myListener);
		// 初始化資料項
		listLeft = new ArrayList<Map<String, String>>();
		for (int i = 1; i < 10; i++) {
			HashMap<String, String> mapTemp = new HashMap<String, String>();
			mapTemp.put("item", "left " + i);
			listLeft.add(mapTemp);
		}

		tvRight = (TextView) this.findViewById(R.id.tv_right);
		tvRight.setOnClickListener(myListener);
		// 初始化資料項
		listRight = new ArrayList<Map<String, String>>();
		for (int i = 1; i < 10; i++) {
			HashMap<String, String> mapTemp = new HashMap<String, String>();
			mapTemp.put("item", "right " + i);
			listRight.add(mapTemp);
		}

		tvMiddle = (TextView) this.findViewById(R.id.tv_middle);
		tvMiddle.setOnClickListener(myListener);
		// 初始化資料項
		listMiddle = new ArrayList<Map<String, String>>();
		for (int i = 1; i < 10; i++) {
			HashMap<String, String> mapTemp = new HashMap<String, String>();
			mapTemp.put("item", "mid " + i);
			listMiddle.add(mapTemp);
		}
	}

	private View.OnClickListener myListener = new View.OnClickListener() {

		@Override
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.tv_left:
				if (popLeft != null && popLeft.isShowing()) {
					popLeft.dismiss();
				} else {
					layoutLeft = getLayoutInflater().inflate(
							R.layout.pop_menulist, null);
					menulistLeft = (ListView) layoutLeft
							.findViewById(R.id.menulist);
					SimpleAdapter listAdapter = new SimpleAdapter(
							MainActivity.this, listLeft, R.layout.pop_menuitem,
							new String[] { "item" },
							new int[] { R.id.menuitem });
					menulistLeft.setAdapter(listAdapter);

					// 點選listview中item的處理
					menulistLeft
							.setOnItemClickListener(new AdapterView.OnItemClickListener() {

								@Override
								public void onItemClick(AdapterView<?> arg0,
										View arg1, int arg2, long arg3) {
									// 改變頂部對應TextView值
									String strItem = listLeft.get(arg2).get(
										"item");
									tvLeft.setText(strItem);
									
									// 隱藏彈出視窗
									if (popLeft != null && popLeft.isShowing()) {
										popLeft.dismiss();
									}
								}
							});

					// 建立彈出視窗
					// 視窗內容為layoutLeft,裡面包含一個ListView
					// 視窗寬度跟tvLeft一樣
					popLeft = new PopupWindow(layoutLeft, tvLeft.getWidth(),
							LayoutParams.WRAP_CONTENT);

					ColorDrawable cd = new ColorDrawable(-0000);
					popLeft.setBackgroundDrawable(cd);
					popLeft.setAnimationStyle(R.style.PopupAnimation);
					popLeft.update();
					popLeft.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
					popLeft.setTouchable(true); // 設定popupwindow可點選
					popLeft.setOutsideTouchable(true); // 設定popupwindow外部可點選
					popLeft.setFocusable(true); // 獲取焦點

					// 設定popupwindow的位置(相對tvLeft的位置)
					int topBarHeight = rlTopBar.getBottom();
					popLeft.showAsDropDown(tvLeft, 0,
							(topBarHeight - tvLeft.getHeight()) / 2);

					popLeft.setTouchInterceptor(new View.OnTouchListener() {

						@Override
						public boolean onTouch(View v, MotionEvent event) {
							// 如果點選了popupwindow的外部,popupwindow也會消失
							if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
								popLeft.dismiss();
								return true;
							}
							return false;
						}
					});
				}
				break;
			case R.id.tv_right:
				if (popRight != null && popRight.isShowing()) {
					popRight.dismiss();
				} else {
					layoutRight = getLayoutInflater().inflate(
							R.layout.pop_menulist, null);
					menulistRight = (ListView) layoutRight
							.findViewById(R.id.menulist);
					SimpleAdapter listAdapter = new SimpleAdapter(
							MainActivity.this, listRight, R.layout.pop_menuitem,
							new String[] { "item" },
							new int[] { R.id.menuitem });
					menulistRight.setAdapter(listAdapter);

					// 點選listview中item的處理
					menulistRight
							.setOnItemClickListener(new AdapterView.OnItemClickListener() {

								@Override
								public void onItemClick(AdapterView<?> arg0,
										View arg1, int arg2, long arg3) {
									String strItem = listRight.get(arg2).get(
										"item");
									tvRight.setText(strItem);
									
									if (popRight != null && popRight.isShowing()) {
										popRight.dismiss();
									}
								}
							});

					popRight = new PopupWindow(layoutRight, tvRight.getWidth(),
							LayoutParams.WRAP_CONTENT);

					ColorDrawable cd = new ColorDrawable(-0000);
					popRight.setBackgroundDrawable(cd);
					popRight.setAnimationStyle(R.style.PopupAnimation);
					popRight.update();
					popRight.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
					popRight.setTouchable(true); // 設定popupwindow可點選
					popRight.setOutsideTouchable(true); // 設定popupwindow外部可點選
					popRight.setFocusable(true); // 獲取焦點

					// 設定popupwindow的位置
					int topBarHeight = rlTopBar.getBottom();
					popRight.showAsDropDown(tvRight, 0,
							(topBarHeight - tvRight.getHeight()) / 2);

					popRight.setTouchInterceptor(new View.OnTouchListener() {

						@Override
						public boolean onTouch(View v, MotionEvent event) {
							// 如果點選了popupwindow的外部,popupwindow也會消失
							if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
								popRight.dismiss();
								return true;
							}
							return false;
						}
					});
				}
				break;
			case R.id.tv_middle:
				if (popMiddle != null && popMiddle.isShowing()) {
					popMiddle.dismiss();
				} else {
					layoutMiddle = getLayoutInflater().inflate(
							R.layout.pop_menulist, null);
					menulistMiddle = (ListView) layoutMiddle
							.findViewById(R.id.menulist);
					SimpleAdapter listAdapter = new SimpleAdapter(
							MainActivity.this, listMiddle, R.layout.pop_menuitem,
							new String[] { "item" },
							new int[] { R.id.menuitem });
					menulistMiddle.setAdapter(listAdapter);

					// 點選listview中item的處理
					menulistMiddle
							.setOnItemClickListener(new AdapterView.OnItemClickListener() {

								@Override
								public void onItemClick(AdapterView<?> arg0,
										View arg1, int arg2, long arg3) {
									String strItem = listMiddle.get(arg2).get(
										"item");
									tvMiddle.setText(strItem);
									
									if (popMiddle != null && popMiddle.isShowing()) {
										popMiddle.dismiss();
									}
								}
							});

					popMiddle = new PopupWindow(layoutMiddle, tvMiddle.getWidth(),
							LayoutParams.WRAP_CONTENT);

					ColorDrawable cd = new ColorDrawable(-0000);
					popMiddle.setBackgroundDrawable(cd);
					popMiddle.setAnimationStyle(R.style.PopupAnimation);
					popMiddle.update();
					popMiddle.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
					popMiddle.setTouchable(true); // 設定popupwindow可點選
					popMiddle.setOutsideTouchable(true); // 設定popupwindow外部可點選
					popMiddle.setFocusable(true); // 獲取焦點

					// 設定popupwindow的位置
					int topBarHeight = rlTopBar.getBottom();
					popMiddle.showAsDropDown(tvMiddle, 0,
							(topBarHeight - tvMiddle.getHeight()) / 2);

					popMiddle.setTouchInterceptor(new View.OnTouchListener() {

						@Override
						public boolean onTouch(View v, MotionEvent event) {
							// 如果點選了popupwindow的外部,popupwindow也會消失
							if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
								popMiddle.dismiss();
								return true;
							}
							return false;
						}
					});
				}
				break;
			default:
				break;
			}
		}

	};

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

}

以上程式碼有詳細的註釋,這裡就不做過多解釋啦!原理比較簡單,點選工具欄上的TextView會彈出PopupWindow,裡面包含ListView,顯示所有選單項。

相關推薦

android利用PopupWindow實現工具選單

package com.example.dropdownmenu; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.os.Bu

文字框框並賦值

實現下面效果  窗體:Form1: 一:窗體佈局:文字框一個或多個,下拉框一個,初始化隱藏,定義全域性變數 string click_value = ""; private void Form1_Load(object sender, EventArgs e) {

android開發】使用PopupWindow實現頁面頂部選單

沒有太多花樣,也沒有很複雜的技術,就是簡單的PopupWindow的使用,可以實現點選彈出一個自定義的view,view裡可以隨便設計,常用的可以放一個listview。 demo中我只是一個點選展示,簡單的使用了fade in out的動畫效果,也沒有精美的圖片資源,

android仿微信、QQ等聊天介面,實現輸入框軟鍵盤、其他區域收起軟鍵盤,預設滑動至最低端

如圖所示,點選輸入框及選擇圖片和傳送按鈕時軟鍵盤顯示且不消失,點選其他區域,則隱藏軟鍵盤。 主要程式碼如下: override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { if (ev!!.getAction() ==

android 實現輸入框日期選擇對話方塊(DatePickerDialog)

前言 這裡我們實現一個功能,點選日期輸入框(EditText),即可彈出日期選擇對話方塊(DatePickerDialog),等使用者選擇日期後,將使用者選擇的日期顯示在日期輸入框。 1.activity_main.xml 這裡只有一個TextView和EditText。

Android PopupWindow實現從頂部選單左、中、右

          本例項的自定義下拉選單主要是繼承PopupWindow類來實現的彈出窗體,各種佈局效果可以根據自己定義設計。彈出的動畫效果主要用到了translate、alpha、scale,具體實現步驟如下:          先上效果圖如下:左邊下拉選單、中間下拉選

經典的js問題 實現li能夠當前li索引與innerHTML的函式

經典的js問題  實現點選li能夠彈出當前li索引與innerHTML的函式 點選其中一項需要alert出如下結果: 按照我們平常的想法,程式碼應該是這樣寫的: var myul = document.getElementsByTagName("ul")[0];

實現Bootstrap導航條可和滑鼠懸停顯示選單

使用Bootstrap導航條元件時,如果你的導航條帶有下拉選單,那麼這個帶下拉選單的導航在點選時只會浮出下拉選單,它本身的href屬性會失效,也就是失去了超連結功能,這並不是我想要的,我希望導航條的連結可以正常開啟它的連結,但又需要下拉選單功能,開始折騰~ 首先解決帶下拉

JS如何給ul的所有li繫結點事件,使其標和內容

這是一個非常常見的面試題,出題方式多樣,但考察點相同,下面我們來看看這幾種方法: 方法一: var itemli = document.getElementsByTagName("li"); for(var i = 0; i<itemli.length; i++){   

jQuery頁面其他部分隱藏選單

一、開發小要點     web頁面中,我們一般不用select、option來實現下拉選單效果,因為下拉框的樣式醜且難以美化,所以我們選擇控制ul顯示隱藏來實現同樣且高大上的效果,但是不能像下拉框那樣點選頁面其他部分,下拉選單收起或隱藏,該怎麼辦呢?只能用js這老大哥來控制了。 二、程式碼     HT

Android popwindow和fragment結合 左側選單 切換介面

      延續上一篇文章Android 實現對話方塊圓角功能 ,在專案推進的過程當中,之前是已經用popwindow實現了點選按鈕,在按鈕下方彈出下拉選單,實現了類似微信右上角加好友的功能,有興趣的朋友,可以下載這個資源。迴歸主題,之前popwindow的使用,是固定在

Android 設定主題實現波紋效果

開頭先說說大家都知道的Material Design。 這裡推薦大苞米的系列部落格,介紹的很全面。 http://blog.csdn.net/a396901990/article/category/2634371     Material Design: &

Android 中Layout實現水波紋特效

Android5.0以後TextView,Button、TabLayout等控制元件預設都有點選水波紋效果,那佈局類LinearLayout、RelativeLayout、TableLayout、FrameLayout、AbsoluteLayou如何實現 A:

JS實現導航之後頁面滾動

原文地址:http://blog.csdn.net/luoshengmenwh/article/details/52830687 側欄導航點選實現頁面內容部分運動到相應位置,以及隨著body滾動條滾動使導航按鈕效果和頁面相應內容對應上的一個效果。  <!doct

android中怎麼實現按鈕進行頁面的跳轉

第一步:先建立好兩個Activity。如圖(PS:是建立Activity,不是建立java類。右擊包名,找到new-->other-->android-->AndroidActivity。然後根據提示完成Activity的建立。系統會自動建立好兩個Activ

Android中ClearEditText實現EditText輸入框右邊清除圖示來清除輸入內容的兩種方式

兩種EditText輸入框點選右邊清除圖示來實現清除功能的方式。 效果圖下圖: 佈局程式碼如下, <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln

Android 通過ViewPager實現和滑動切換Fragment標籤頁

      如上圖效果,要切換 Fragment 標籤頁,可以通過點選標籤或者滑動標籤頁來實現。 網上應該有封裝好的開源庫可以直接利用,不過這裡介紹一下自己通過 ViewPager 實現該效果。 首先是佈局檔案: <?xml version="1.0" encodi

ListViewitem底部popupWindow刪除、修改、取消選擇框

先看一下效果: 點選單個item彈出選擇框,可以選擇刪除或者修改。刪除單條item,或者跳轉到修改頁面。 listview的佈局: <?xml version="1.0" encoding="utf-8"?> <LinearLay

android--EditTextView 後無法輸入法

今日,遇到一個小問題,點選EdittextView後,輸入法彈窗無法彈出,搜尋之後發現http://blog.csdn.net/jdsjlzx/article/details/32314627 文章中給出了詳細的解釋,但是修改後依然無法彈出,最後發現: mEditText

bootstrap刪除按鈕確認框實現

<%@ page language="java" import="com.student.servlet.*" contentType="text/html; charset=UTF-8"