Android 自定義PopupWindow以及引數傳遞與返回
在這篇部落格之前,還寫了一篇關於PopupWindow,那篇主要是關於PopupWindow彈出位置的設定。以及選擇PopupWindow佈局後的監聽。詳情看Android popupwindow 示例程式一。接下來這篇主要是講自定義PopupWindow以及引數傳遞與返回,我在裡面寫了一個listview來示例。接下來看程式碼,都有所註釋。
一、MainActivity
二、TestPopwindow2<span style="background-color: rgb(240, 240, 240);">package com.example.popupwimdow;</span> import java.util.ArrayList; import com.example.popupwimdow.TestPopwindow2.OnGetData; import android.os.Bundle; import android.app.Activity; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.PopupWindow.OnDismissListener; import android.widget.Toast; /** * * @author mmsx * 博主部落格網址: http://blog.csdn.net/qq_16064871 */ public class MainActivity extends Activity implements OnClickListener, OnDismissListener { private ArrayList<ItemTest> mArrayList = new ArrayList<ItemTest>(); private TestPopwindow2 mTestPopwindow2 = null; private int mnSeclectItem = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); InitUI(); } private void InitUI() { if (mArrayList != null) { mArrayList.clear(); for (int i = 0; i < 3; i++) { ItemTest itemTest1 = new ItemTest(R.drawable.bmp1, "圖片一"); mArrayList.add(itemTest1); ItemTest itemTest2 = new ItemTest(R.drawable.bmp2, "圖片二"); mArrayList.add(itemTest2); } } // 例項化TestPopwindow2 mTestPopwindow2 = new TestPopwindow2(this); // 設定點選其他位置mTestPopwindow2消失 mTestPopwindow2.setOnDismissListener(this); Button buttonTest2 = (Button) findViewById(R.id.buttonTest2); buttonTest2.setOnClickListener(this); } private void OnPopwindowTest2() { if (mTestPopwindow2 == null) return; //回到接受 mTestPopwindow2.setOnData(new OnGetData() { //記錄上一次選中的item @Override public int onSeclectItem() { return mnSeclectItem; } //回撥接受函式 @Override public void onDataCallBack(int nSectlect,ArrayList<ItemTest> mArrayList) { Toast.makeText(getApplicationContext(), "listview 的點選" + String.valueOf(nSectlect), Toast.LENGTH_SHORT).show(); mnSeclectItem = nSectlect; } //傳遞資料來源過去 @Override public ArrayList<ItemTest> onArrayList() { return mArrayList; } }); // location獲得控制元件的位置 int[] location = new int[2]; View v = findViewById(R.id.buttonTest2); if (v != null) v.getLocationOnScreen(location); // 控制元件在螢幕的位置 mTestPopwindow2.setAnimationStyle(R.style.AppBaseTheme); // mTestPopwindow2彈出在某控制元件(button)的下面 mTestPopwindow2.showAtLocation(v, Gravity.TOP | Gravity.LEFT, location[0] - v.getWidth(), location[1] + v.getHeight()); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.buttonTest2: OnPopwindowTest2(); break; default: break; } } // 點選其他地方消失 @Override public void onDismiss() { } }
三、listview裡面的實體類ItemTestpackage com.example.popupwimdow; import java.util.ArrayList; import android.app.ActionBar.LayoutParams; import android.app.Activity; import android.content.Context; import android.graphics.drawable.BitmapDrawable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.TextView; /** * 自定義TestPopwindow2 * @author mmsx * 博主部落格網址: http://blog.csdn.net/qq_16064871 */ public class TestPopwindow2 extends PopupWindow implements OnItemClickListener{ // 根檢視 private View mRootView; private LayoutInflater mInflater; // ArrayList陣列,listview原始資料 private ArrayList<ItemTest> mArrayList; // 資料介面 OnGetData mOnGetData; // listview介面卡 SelfTypeAdapt mSelfTypeAdapt; private int mnSeclectItem = 0; public TestPopwindow2(Activity context) { super(context); InitData(context); InitUI(); } // 資料介面設定,資料來源介面傳入 public void setOnData(OnGetData sd) { mOnGetData = sd; mArrayList = new ArrayList<ItemTest>(); if (mOnGetData != null) { mArrayList = mOnGetData.onArrayList(); mnSeclectItem = mOnGetData.onSeclectItem(); } } // 資料介面抽象方法 public interface OnGetData { abstract ArrayList<ItemTest> onArrayList(); abstract int onSeclectItem(); abstract void onDataCallBack(int nSectlect, ArrayList<ItemTest> mArrayList); } private void InitData(Context context) { mInflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); mRootView = mInflater.inflate(R.layout.test_popwindow_2, null); setContentView(mRootView); this.setWidth(LayoutParams.FILL_PARENT); this.setHeight(LayoutParams.WRAP_CONTENT); // 設定PopUpWindow彈出的相關屬性 setTouchable(true); setOutsideTouchable(true); setFocusable(true); setBackgroundDrawable(new BitmapDrawable(context.getResources())); update(); getContentView().setFocusableInTouchMode(true); getContentView().setFocusable(true); setAnimationStyle(R.style.AppBaseTheme); } private void InitUI() { ListView listView = (ListView) mRootView .findViewById(R.id.listView1); mSelfTypeAdapt = new SelfTypeAdapt(mRootView.getContext()); listView.setAdapter(mSelfTypeAdapt); listView.setOnItemClickListener(this); } public class SelfTypeAdapt extends BaseAdapter { private Context mContext; private LayoutInflater mLayoutInflater; public SelfTypeAdapt(Context context) { mContext = context; mLayoutInflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return mArrayList == null ? 0 : mArrayList.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { viewHolder = new ViewHolder(); convertView = (LinearLayout) mLayoutInflater.inflate( R.layout.listview_item, null); viewHolder.textView = (TextView) convertView .findViewById(R.id.textViewTest); viewHolder.imageView = (ImageView) convertView .findViewById(R.id.imageView1); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } ItemTest itemTest = new ItemTest(); itemTest = mArrayList.get(position); viewHolder.textView.setText(itemTest.getImageViewID()); viewHolder.imageView.setImageResource(itemTest.getImageViewID()); return convertView; } } // 內部類實現,提升listview效率 class ViewHolder { public ImageView imageView; public TextView textView; } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mOnGetData.onDataCallBack(position, mArrayList); dismiss(); } }
四、佈局檔案package com.example.popupwimdow; /** * 實體類 ItemTest * @author mmsx * 博主部落格網址: http://blog.csdn.net/qq_16064871 */ public class ItemTest { private int mImageViewID; private String mstrName; public ItemTest(){ } public ItemTest(int ImageViewID, String strName) { this.mImageViewID = ImageViewID; this.mstrName = strName; } public int getImageViewID() { return mImageViewID; } public String getstrName() { return mstrName; } }
1、activity_main
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayoutMain"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right">
<Button
android:id="@+id/buttonTest2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="測試2" />
</LinearLayout>
</LinearLayout>
2、test_popwindow_2<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#00ff" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" >
</ListView>
</LinearLayout>
3、listview_item<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/bmp1" />
<TextView
android:id="@+id/textViewTest"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:gravity="center"
android:text="TextView"
android:textColor="#FF236A9C" />
</LinearLayout>
在這上面主要展示的是點選button後,在這個button下方彈出PopupWindow。PopupWindow的內容是一個listview佈局。那listview的資料來源使用抽象介面傳進去以及返回選擇後的listview的item資訊。這是一個靈活使用PopupWindow之一,大可以根據實際需要,做出不同的效果。
五、實現效果
專案資源下載:
轉載請註明出處的部落格網址: http://blog.csdn.net/qq_16064871
如有轉載未註明出處部落格網址,或者沒有得到作者的同意。作者持有版權所有權。
相關推薦
Android 自定義PopupWindow以及引數傳遞與返回
在這篇部落格之前,還寫了一篇關於PopupWindow,那篇主要是關於PopupWindow彈出位置的設定。以及選擇PopupWindow佈局後的監聽。詳情看Android popupwindow 示例程式一。接下來這篇主要是講自定義PopupWindow以及引數傳遞與返
Android 自定義PopupWindow實現懸浮窗效果
有時候我們需要在介面上彈出一個視窗,而Android中彈出窗體有兩種方式:一種是AlertDialog,另一種就是PopupWindow,AlertDialog的位置是固定的,而PopupWindow的位置可以任意指定。下面我們使用自定義的PopupWindow來完成以下的效果圖:
Android 自定義DialogFragment 以及設定寬高
DialogFragment 的特點是具有dialog 的 效果,同時又可以擁有Fragment 的生命週期,因此我們可以像管理Fragment 一樣管理DialogFragment 。在 Android 中我們已經Dialog 類了,為什麼還要增加一
Android自定義View高階(一)-分類與流程
一.自定義View繪製流程 二.自定義View分類 自定義ViewGroup 自定義ViewGroup一般是利用現有的元件根據特定的佈局方式來組成新的元件,大多繼承自ViewGroup或各種Layout。 自定義View 在沒有現成的View,
Android 自定義PopupWindow指定位置或給定View座標彈出
PopupWindowHelper是一個根據View的位置顯示PopupWindow的一個工具類、彈出PopupWindow的位置會根據指定的View出現的位置而動態改變、本Demo是用Android Studio開發的、分為兩個Module、但我個人更習慣合到
Android自定義super以及this的用法問題
Android自定義開發當中的繼承view的時候,我們一般會使用3個建構函式 因為四個引數的建構函式是API21之後才出來的,所以我們暫時都是使用的都是這3種。在我自己學習自定義的過程當中,就在這個建構函式的地方出了問題。將super和this的用法弄錯了。所以自己在這裡記
android自定義流式佈局解析與原始碼
今天給大家解析一下自定義流式佈局的編寫,以及分析一下寫程式碼過程遇到的難點。該佈局支援水平垂直方向和子view gravity選擇,先看一下執行的效果,左邊是垂直佈局,右邊是水平佈局,套一個scrollview就支援滑動了 說一下遇
android 自定義PopupWindow
1:先看執行效果: 2:直接上程式碼:MainActivity.java package com.youpeng.popwindowdemo; import android.app.Activity; import android.content.Conte
Android--Intent組件帶參傳遞與返回
puts 例子 ast pause onstop 圖標 訪問 數據頁面 .com Android 是 單例模式: 表示 application 唯一的。每個應用被啟動的時候,其實是 application 被創建。 Context 上下文: context 是
C函式引數傳遞與返回值傳遞
(1)引數傳遞 __stdcall和__cdecl都是函式呼叫約定關鍵字,先給出這兩者的區別,然後舉例項分析: __stdcall:引數由右向左壓入堆疊;堆疊由函式本身清理。 __cdecl:引數也是由右向左壓入堆疊;但堆疊由呼叫者清理。
android呼叫webservice傳遞自定義類以及類的集合
package com.cbq.webServiceTest; import java.util.Hashtable; import org.ksoap2.serialization.KvmSerializable; import org.ksoap2.serialization.PropertyInfo;
Android自定義view與activity的傳值
重復 轉動 自定義 activit 廣播 內部 代碼 view 等待 昨晚在寫團隊項目的時候,遇到一個問題,直到今天早上才解決。。。即在自定義view“轉盤”結束轉動後獲取結果的處理中,我是想吧值傳到activity中的一個textview中的,但我的自定義view類不是a
Android 自定義型別檔案與程式關聯
0x01 功能 實現在其他應用中開啟某個字尾名的檔案 可以直接跳轉到本應用中的某個activity進行處理 0x01 實現 首先建立一個activity ,然後在manifest裡對該activity項編輯,加入 <intent-
Android 自定義Listview 與巢狀ScrollView
本文講實現一個自定義列表的Android程式,程式將實現一個使用自定義的介面卡(Adapter)繫結資料,通過ontextView.setTag繫結資料有按鈕的ListView。 系統顯示列表(ListView)時,首先會例項化一個介面卡,本文將例項化一個自定義的介面卡。實現自
Python 函式定義以及引數傳遞
Python 函式定義以及引數傳遞1.函式定義#形如def func(args...): doSomething123以關鍵字def 開頭,後面是函式名和引數下面是函式處理過程。 舉例: def add( a, b ): return a+b12引數可以設定預設值,如: def add( a, b=10
Android——自定義View(學習Android開發與藝術探索)
ViewRoot和DecorView ViewRoot對應於ViewRootImpl類,是連線WindowManager和DecorView的紐帶,View的三大流程均是通過ViewRoot來完成的。在ActivityThread中,當Activity物件被建
Android自定義屬性時format選項引數說明及用法
Android自定義屬性時format選項可以取用的值1. reference:參考某一資源ID。 (1)屬性定義:[html] view plaincopyprint?<declare-styleable name="名稱"> <attr
Android--自定義Button的樣式以及動態漸變效果
之前開發使用過自定義樣式的Button,使用挺簡單的,但也很常用,因此總結一下。 1,使用drawable檔案自定義靜態的Button樣式 首先,自定義一個drawable檔
Android自定義許可權與使用
本篇部落格介紹下Android開發者如何自定義許可權,進而如何將自己的部分元件暴露。並介紹客戶端如何呼叫這些暴露的元件。 1. 如何自定義許可權 Android允許我們使用permission標籤,在Manifest檔案中定義屬於自己的許可權,一個例子如
Android自定義View總結(一)基礎知識與例項
自定義View是最能體現一個Android開發者水平的技能之一了。 接下來的一些列部落格將總結一下Android的自定義相關View知識,包括View的結構,事件體系,工作原理,自定義View的繪製等。 參考資料部分來自於書上以及各種部落格。 新建了一個qq群 482