您的位置:首页 > 移动开发 > Android开发

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

2016-01-09 11:15 429 查看
最近在做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文件

这样就完成了拨号界面的调用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: