`

自定义PopupWindow1

阅读更多
什么都不多说,看图先:



点击文本框,弹出最下面的PopupWindow。
很简单的啦,不解释。源码:
package com.dl.view;

import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.LinearLayout.LayoutParams;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.GridView;
import android.widget.PopupWindow;
import android.widget.TextView;

import com.dl.app.R;

public class NumbersPickerPopupWindow extends PopupWindow{
	private Context context;
	private String[] balls=new String[]{"0","1","2","3","4","5","6","7","8","9"};
	private final String split=" "; 
	private Button btn_ok;
	private String selectedNumbers;
	private String[] selectedNumbersArray;
	private GridViewAdapter adapter;
	public NumbersPickerPopupWindow(Context context,View view,String title,String selectedNumbers){
		super(view, LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT, true);
		this.context=context;
		this.selectedNumbers=selectedNumbers;
		selectedNumbersArray=selectedNumbers.trim().split(split);
		this.setBackgroundDrawable(new BitmapDrawable());//必须设置background才能消失  
		this.setOutsideTouchable(false);
        
      //自定义动画  
      this.setAnimationStyle(R.style.PopupAnimation);
      //使用系统动画  
//      mPopupWindow.setAnimationStyle(android.R.style.Animation_Dialog);  
      this.update();  
      this.setTouchable(true);
      this.setFocusable(false);
      
      GridView gridView=(GridView)view.findViewById(R.id.gridView);
      
      adapter=new GridViewAdapter(context,balls);
      
      gridView.setAdapter(adapter);
      
      TextView tv_tips=(TextView)view.findViewById(R.id.tv_tips);
      tv_tips.setText(title);
      
      btn_ok=(Button)view.findViewById(R.id.btn_ok);
      btn_ok.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(onOkClickListener!=null){
					onOkClickListener.onOkClick(v);
				}
				if(isShowing())
					dismiss();
			}
		});
      
	}
	
	public void setSelectedNumbers(String selectedNumbers){
		this.selectedNumbers=selectedNumbers;
		selectedNumbersArray=selectedNumbers.trim().split(split);
		adapter.notifyDataSetChanged();
		
	}
	
	class GridViewAdapter extends BaseAdapter{

		private Context context;
		private String[] balls;
    	public GridViewAdapter(Context context,String[] balls){
    		this.context=context;
    		this.balls=balls;
//    		num=numbers.trim().split(split);
    		
    	}
    	
		public int getCount() {
			// TODO Auto-generated method stub
			return balls.length;
		}

		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return balls[position];
		}

		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			if(convertView==null){
				convertView=LayoutInflater.from(context).inflate(R.layout.simple_grid_item_1_red, null);
			}
			CheckBox checkBox = (CheckBox)convertView.findViewById(R.id.checkBox);//
			checkBox.setText(balls[position]);
			if(selectedNumbersArray!=null&&selectedNumbersArray.length>0){
				for(int i=0;i<selectedNumbersArray.length;i++){
					if(selectedNumbersArray[i].equals(String.valueOf(position))){
						checkBox.setChecked(true);
					}
				}
			}
			
			checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
				
				public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
					// TODO Auto-generated method stub
					if(onItemCheckedListener!=null){
						onItemCheckedListener.onItemCheckedChanged(buttonView,isChecked);
					}
				}
			});
			return convertView;
		}
		
	}
	//接口
	private OnItemCheckedListener onItemCheckedListener;
	public void setOnItemCheckedListener(OnItemCheckedListener onItemCheckedListener) {
		this.onItemCheckedListener = onItemCheckedListener;
	}

	public interface OnItemCheckedListener{
		public void onItemCheckedChanged(CompoundButton buttonView, boolean isChecked);
	}
	
	private OnOkClickListener onOkClickListener;
	public void setOnOkClickListener(OnOkClickListener onOkClickListener) {
		this.onOkClickListener = onOkClickListener;
	}

	public interface OnOkClickListener{
		public void onOkClick(View v);
	}
	
}


用法:
LayoutInflater mLayoutInflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);  
        view = mLayoutInflater.inflate(R.layout.popwindow, null);  
        
		NumbersPickerPopupWindow p=new NumbersPickerPopupWindow(context,view,"选择需要的数字","0 3 6");
		p.setSelectedNumbers("1 4 6");//动态改变选中的值,之间用空格隔开
		p.showAtLocation(views[0], Gravity.BOTTOM, 0, 0);
//还可以定义接口
......


布局文件popwindow.xml:
<?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="wrap_content"
    android:orientation="vertical" 
    android:background="@color/bg_blue_2"
    >

   <RelativeLayout 
        android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:background="@drawable/bg_title_bar"
    	android:padding="5dip"
       >
       <TextView 
        android:id="@+id/tv_tips"
        android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:text="每位至少选择一个数字"
    	android:textColor="@color/white"
    	android:layout_centerInParent="true"
        />
        <Button 
        android:id="@+id/btn_ok"
        android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:text="确定"
    	android:textColor="@color/white"
    	android:background="@drawable/bg_btn_intro"
    	android:layout_alignParentTop="true"
    	android:layout_alignParentRight="true"
        />
   </RelativeLayout>
   
  	<View 
  	    android:layout_width="fill_parent"
    	android:layout_height="1dip"
    	android:background="?android:attr/listDivider"
  	    />
  	<GridView 
  	    android:id="@+id/gridView"
  	    android:layout_width="wrap_content"
    	android:layout_height="fill_parent"
    	android:numColumns="5"
    	android:horizontalSpacing="12dip"
    	android:verticalSpacing="10dip"
    	android:paddingTop="10dip"
    	android:paddingBottom="10dip"
    	android:paddingLeft="40dip"
    	android:paddingRight="40dip"
    	android:gravity="center"
    	android:layout_gravity="center"
  	    />
</LinearLayout>


styles.xml中定义的动画:
<style name="PopupAnimation" parent="android:Animation"  mce_bogus="1" >
        <item name="android:windowEnterAnimation">@anim/anim_in_bottom</item>
        <item name="android:windowExitAnimation">@anim/anim_out_bottom</item>
    </style>


2个动画:
anim_in_bottom.xml,anim_out_bottom.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
	<translate 
	android:fromYDelta="100%p" 
	android:toYDelta="0" 
	android:duration="200" 
	android:fillAfter="true"
	android:interpolator="@android:anim/bounce_interpolator"
	/>
</set>

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
	<translate 
	android:fromYDelta="0" 
	android:toYDelta="100%p" 
	android:duration="200"
	android:fillAfter="true"
	android:interpolator="@android:anim/bounce_interpolator"
	/>
</set>


simple_grid_item_1_red.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
  	android:layout_height="wrap_content"
    android:gravity="center"
    >
<CheckBox
    android:id="@+id/checkBox"
  	android:layout_width="wrap_content"
  	android:layout_height="wrap_content"
  	android:textColor="@color/white"
  	android:gravity="center"
  	android:button="@null"  
    android:background="@drawable/bg_checkbox_redball"
    android:checked="false"
  	/>
    
</LinearLayout>


bg_checkbox_redball.xml:
<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_checked="true" android:drawable="@drawable/red_focus" /> 
    <item android:state_checked="false" android:drawable="@drawable/red" /> 
</selector> 





  • 大小: 295.9 KB
  • 大小: 2.2 KB
  • 大小: 2 KB
分享到:
评论
1 楼 antoon.nee 2012-05-17  
楼主,R.layout.simple_grid_item_1_red找不到。

相关推荐

    自定义popupWindow修改版

    在这个“自定义popupWindow修改版”项目中,我们将深入探讨如何根据需求定制PopupWindow,以实现更丰富的功能和更好的用户体验。 首先,PopupWindow的基本用法包括创建PopupWindow对象、设置显示内容、指定显示位置...

    自定义popupWindow

    自定义PopupWindow则是为了满足开发者对显示样式、交互效果的个性化需求。下面我们将深入探讨自定义PopupWindow的相关知识点。 一、PopupWindow基础 1. 创建PopupWindow: 要创建一个PopupWindow,首先需要一个...

    andorid 自定义popupwindow菜单

    在Android开发中,自定义`PopupWindow`是一个常见的需求,特别是在设计交互丰富的界面时,它能为用户提供一种快捷、临时的交互方式。`PopupWindow`允许开发者创建弹出式视图,可以显示在屏幕的任意位置,常用于下拉...

    Android自定义PopupWindow

    1. 创建`PopupWindow`实例:首先需要一个View对象,这个View就是`PopupWindow`显示的内容,通常我们通过inflate方法加载布局文件得到。然后通过`new PopupWindow(view, width, height)`来创建`PopupWindow`,传入...

    自定义PopupWindow,实现spinner下拉选择列表

    本教程将详细讲解如何通过自定义PopupWindow来实现一个具有更多定制功能的Spinner下拉选择列表。 首先,我们需要了解PopupWindow的基本概念。PopupWindow是Android提供的一种可以弹出窗口的类,它可以在任何视图上...

    自定义PopupWindow

    在本教程中,我们将深入探讨如何自定义一个简单的PopupWindow,包括设置其布局、添加点击事件以及适配初学者的理解。 首先,PopupWindow的核心在于它的布局文件。在Android项目中,创建一个新的XML布局文件,例如`...

    android自定义PopupWindow

    1. **创建View**:`PopupWindow` 显示的内容是通过一个View来承载的,所以我们首先需要创建一个自定义的View,例如继承自 `LinearLayout` 或 `RelativeLayout`,并在其中添加需要展示的元素,如TextView、ImageView...

    android自定义通用PopupWindow

    封装`PopupWindow`的第一步是创建一个自定义的类,继承自`PopupWindow`。在这个类中,我们可以添加一些通用的方法,例如设置宽高、内容视图、背景颜色等。下面是一个基础的实现: ```java public class ...

    自定义PopupWindow和弹出位置

    本案例详细介绍了自定义PopupWindow和各种弹出显示动画,以及显示位置控制。 包括: 1&gt; Activity中直接new PopupWindow()对象来使用; 2&gt; 各种样式自定义PopupWindow; 3&gt; PopupWindow的入场和出场动画样式.

    自定义PopupWindow动画效果

    总的来说,自定义PopupWindow动画效果是一个涉及动画、源码理解和工具运用的综合过程。通过巧妙的动画设计和代码实现,可以为用户带来更加生动有趣的交互体验。在实际项目中,根据需求选择合适的动画类型,结合源码...

    android自定义popupwindow仿微信

    在Android开发中,自定义PopupWindow是一种常见的交互方式,它能提供类似对话框的效果,但比对话框更灵活,可以自由地控制显示位置和样式。本篇内容将深入讲解如何模仿微信的PopupWindow实现,以增强应用的用户体验...

    android 自定义popupwindow 可以多方向弹出,可以自定义位置,项目源码,直接解压

    在自定义PopupWindow时,我们需要关注以下几个关键点: 1. **创建PopupWindow实例**:首先,我们需要创建一个PopupWindow实例,传入想要显示的布局视图、宽度和高度。例如: ```java View popupView = ...

    自定义popupwindow

    在标题“自定义popupwindow”和描述“这是一个自定义popupwindow的例子,可以参考一下”中,我们可以深入探讨如何在Android应用中实现和自定义PopupWindow。 首先,PopupWindow的基本使用步骤包括: 1. **创建...

    自定义popupWindow弹出框

    在Android开发中,系统默认的对话框样式往往不能完全满足开发者和用户的需求,这时就需要我们自定义`PopupWindow`来创建具有个性化特色的弹出框。`PopupWindow`是Android提供的一种轻量级的弹出视图,它可以浮现在...

    android自定义popupwindow仿微信右上角弹出菜单效果

    2. **自定义PopupWindow类**:通常我们会创建一个继承自`PopupWindow`的类,以便封装一些通用功能。例如,可以添加初始化布局、设置大小、背景、动画等功能。在提供的代码片段中,可以看到一个自定义的`PopupWindow`...

    超级简单的自定义PopupWindow 子控件的四个方向 底部

    在本教程中,我们将深入探讨如何自定义PopupWindow,使其子控件能够在父控件的四个方向——底部、顶部、左侧和右侧进行对齐。 首先,PopupWindow的基本用法包括创建实例、设置内容视图、指定显示位置以及显示窗口。...

    Android自定义popupwindow实例代码

    在Android开发中,`PopupWindow` 是一个非常实用的组件,用于创建弹出式窗口,它可以显示在屏幕任意位置,并且可以自定义其内容和样式。本文将详细介绍如何在Android中自定义`PopupWindow`,并实现弹出菜单的效果。 ...

    自定义PopupWindow实现底部弹出式菜单

    本篇将深入探讨如何利用`PopupWindow`来实现一个自定义的底部弹出式菜单。 首先,`PopupWindow`的基本用法包括初始化、设置布局、显示和隐藏等步骤。在自定义底部菜单时,我们需要创建一个包含菜单项的布局文件,每...

Global site tag (gtag.js) - Google Analytics