android-电话窗口弹出以及LayoutInflater和inflate的用法

最近在做android项目的时候要用到一个从底部弹出电话窗口功能,差了很多资料,也有很多说法,自己在这里做简单总结,为以后方便实用。


首先在所需要调用的activity做如下声明


参数声明

 //phoneNumber界面参数
	 private LayoutInflater inflater;
	 private EditText phone;
	 private Button  delete;
	 private View viewPhone;


在onCreate方法中加入

//phoneNumber界面参数定义
		inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		viewPhone= inflater.inflate(R.layout.talkphone, null);
		phone = (EditText) viewPhone.findViewById(R.id.phoneEdit);
		delete = (Button) viewPhone.findViewById(R.id.phoneback);


在这里我们用到了一个  LayoutInflater和inflater,这里对这两个类型作简要说明

/** 
         * LayoutInflater这个类的作用类似于findViewById(), 
         * 不同点: 
         *     LayoutInflater是用来找layout下xml布局文件的,而且它会实例化 
         *     findViewById()是找具体xml布局文件下的具体widget控件,比如:Button按钮 
         *  
         *  
         *  
         * inflate就相当于将一个xml中定义的布局找出来.     
         * 因为如果在一个Activity文件里直接用findViewById()这个方法的话, 
         * 那么它所对应的是setConentView()中调用的那个layout里的组件.    
         * 因此如果在同样的Activity里用到别的layout的话, 
         *     而且你还要设置这个layout里的组件(比如:ImageView,TextView)上的内容, 
         *     那么你就必须用inflate()先将这个layout找出来, 然后再用这个layout对象去找到它上面的组件 
         *     然后进行一系列的操作 
         *      
         *     inflate()方法中参数: 
         *       1.想要用的布局文件的id 
         *       2.持有选项卡的内容,获取FrameLayout 
         *       3.true:将此处解析的xml文件做为根视图View 
         */  
具体方式如下
 LayoutInflater inflater = (LayoutInflater)     
mContext.getSystemService(LAYOUT_INFLATER_SERVICE);    
  View layout = inflater.inflate(R.layout.custom_dialog,null);    
  TextView text = (TextView) layout.findViewById(R.id.text);   


也就是说,必须用他自己的view去调用他的组件,否则在当前的activity中是找不到他们的组件的,编译器会抛出NULLPOINTEXCEPTION的错误!


电话窗口弹出的方法

private void showPopwindow() {
		// 利用layoutInflater获得View
		View v = (Button) viewPhone.findViewById(R.id.number0);
		
		v.setOnClickListener(this);
		for(int i=0;i<5;i++)
		{
			v = viewPhone.findViewById(R.id.number1 + i);
			v.setOnClickListener(this);
		}
		for(int i = 0;i<4;i++)
		{
			v = viewPhone.findViewById(R.id.number6 + i);
			v.setOnClickListener(this);
		}
		delete.setOnClickListener(this);
		delete.setOnLongClickListener(new OnLongClickListener() {
			public boolean onLongClick(View v) {
				phone.setText("");
				return false;
			}
		});
		// 下面是两种方法得到宽度和高度 getWindow().getDecorView().getWidth()

		PopupWindow window = new PopupWindow(viewPhone,
				WindowManager.LayoutParams.MATCH_PARENT,
				WindowManager.LayoutParams.WRAP_CONTENT);
		window.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
		// 设置popWindow弹出窗体可点击,这句话必须添加,并且是true
		window.setFocusable(true);


		// 实例化一个ColorDrawable颜色为半透明
		ColorDrawable dw = new ColorDrawable(0xb0000000);
		window.setBackgroundDrawable(dw);

		
		// 设置popWindow的显示和消失动画
		window.setAnimationStyle(R.style.mypopwindow_anim_style);
		// 在底部显示
		window.showAtLocation(Room.this.findViewById(R.id.call_recv),
				Gravity.BOTTOM, 0, -300);

	/*	// 这里检验popWindow里的button是否可以点击
		Button first = (Button) view.findViewById(R.id.number1);
		first.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				System.out.println("第一个按钮被点击了");
			}
		});
		*/
		//popWindow消失监听方法
		window.setOnDismissListener(new OnDismissListener() {
			
			@Override
			public void onDismiss() {
				System.out.println("popWindow消失");
			}
		});

	}



	@Override
	public void onClick(View v)
	{
		switch(v.getId())
		{
		case R.id.number0:
			if(phone.getText().length()<12)
			{
				input(v.getTag().toString());
				break;
			}
		case R.id.number1:
			if(phone.getText().length()<12)
			{
				input(v.getTag().toString());
				break;
			}
		case R.id.number2:
			if(phone.getText().length()<12)
			{
				input(v.getTag().toString());
				break;
			}
		case R.id.number3:
			if(phone.getText().length()<12)
			{
				input(v.getTag().toString());
				break;
			}
		case R.id.number4:
			if(phone.getText().length()<12)
			{
				input(v.getTag().toString());
				break;
			}
		case R.id.number5:
			if(phone.getText().length()<12)
			{
				input(v.getTag().toString());
				break;
			}
		case R.id.number6:
			if(phone.getText().length()<12)
			{
				input(v.getTag().toString());
				break;
			}
		case R.id.number7:
			if(phone.getText().length()<12)
			{
				input(v.getTag().toString());
				break;
			}
		case R.id.number8:
			if(phone.getText().length()<12)
			{
				input(v.getTag().toString());
				break;
			}
		case R.id.number9:
			if(phone.getText().length()<12)
			{
				input(v.getTag().toString());
				break;
			}
		case R.id.phoneback:
			delete();
			break;
		}
	}

	private void input(String str)
	{
		int c = phone.getSelectionStart();
		String p = phone.getText().toString();
		phone.setText(p.substring(0, c) + str + p.substring(phone.getSelectionStart(), p.length()));
		phone.setSelection(c + 1, c + 1);
	}
	private void delete() {
		int c = phone.getSelectionStart();
		if (c > 0) {
			String p = phone.getText().toString();
			phone.setText(p.substring(0, c - 1) + p.substring(phone.getSelectionStart(), p.length()));
			phone.setSelection(c - 1, c - 1);
		}
	}

这里的showPowwindow()方法就是从底部弹出一个对话框。


然后需要添加两个XML来设置出现和消失的动画效果,具体XML实现方式如下,我们给他起名字叫pophidden_anim


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
	
     <translate
        android:duration="200"
        android:fromYDelta="0"
        android:toYDelta="50%p" />

    <alpha
        android:duration="200"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />
</set>

另一个XML的实现方式如下,我们给他起名叫popshow_anim

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

    <alpha
        android:duration="200"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />
</set>

接下来再styles文件里加入显示和隐藏的HTML
 <style name="mypopwindow_anim_style">
        <item name="android:windowEnterAnimation">@anim/popshow_anim</item>
 <!-- 指定显示的动画xml -->

        <item name="android:windowExitAnimation">@anim/pophidden_anim</item>
 <!-- 指定消失的动画xml -->
    </style>

最后是自己写的拨号界面,你自己的layout下边的拨号XML文件

这样就完成了拨号界面的调用


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值