接触android也有几个月了,这几天用到比较多的popupwindow,把一些遇到的问题和自己的解决方法写出来。
关于popupwindow里的控件自适应长宽,使的界面在不同的手机上看起来都比较美观:
布局:
<?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:background="@drawable/background_quality"
android:orientation="vertical" >
<TextView
android:id="@+id/text_popup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dip"
android:layout_marginTop="10dip"
android:paddingBottom="5dip"
android:text="这是一个popupwindow:"
android:textColor="#0000AA"
android:textSize="15dip" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dip"
android:layout_marginRight="10dip"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名:"
android:textColor="#0000AA" />
<EditText
android:layout_width="140dip"
android:layout_height="wrap_content"
android:maxLength="3"
android:text="某某某"
android:inputType="number" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="学号:"
android:textColor="#0000AA" />
<EditText
android:layout_width="140dip"
android:layout_height="wrap_content"
android:maxLength="10"
android:text="5801207021"
android:inputType="number" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dip"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="地址:"
android:textColor="#0000AA" />
<EditText
android:layout_width="140dip"
android:layout_height="wrap_content"
android:text="China..." />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="性别:"
android:textColor="#0000AA" />
<EditText
android:layout_width="140dip"
android:layout_height="wrap_content"
android:text="男"
android:selectAllOnFocus="true" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dip"
android:layout_marginLeft="10dip" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="凑数:"
android:textColor="#0000AA"
android:visibility="invisible" />
<Button
android:id="@+id/btn_Control_Ok"
android:layout_width="140dip"
android:layout_height="wrap_content"
android:gravity="center"
android:text="确认修改"
android:textColor="#0000AA" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="凑数:"
android:textColor="#0000AA"
android:visibility="invisible" />
<Button
android:id="@+id/btn_Control_Cancel"
android:layout_width="140dip"
android:layout_height="wrap_content"
android:gravity="center"
android:text="关闭"
android:textColor="#0000AA" />
</LinearLayout>
</LinearLayout>
效果:
这里的各种控件都比较整齐,而且在其他的不同分辨率手机上的效果也是差不多的。这样的布局只要是应用wrap_content这个属性,将自己的一些button、textview等控件放在layout的时候,确定好自己的控件大小,完全可以使layout自由wrap_content,而不用太关心其的大小。而在生成popupwindow的时候,也是直接设置为wrap_content。
activity代码:
//Layout
LayoutInflater layoutInflater = (LayoutInflater) MainActivity.this.getSystemService(LAYOUT_INFLATER_SERVICE);
View myView = layoutInflater.inflate(R.layout.mypopupwindow, null);
//设置Layout时的大小,这里是自适应
myPopupWindow = new PopupWindow(myView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
btn_PopOK = (Button) myView.findViewById(R.id.btn_Control_Ok);
btn_PopCancel = (Button) myView.findViewById(R.id.btn_Control_Cancel);
btn_ShowpWindow = (Button) findViewById(R.id.btn_popupwindow);
btn_ShowpWindow.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
myPopupWindow.setFocusable(true);//获得焦点,如果不获得焦点,则有一些控件比如edittext是不会有输入法弹出的
// myPopupWindow.setBackgroundDrawable(new PaintDrawable());//设置背景,加了这句,点击边上popupwindow会消失,不知道为什么android中就算的xml中设置了背景,这里要再设置一次,才能达到点击边上popupwindow消失的效果
myPopupWindow.showAtLocation(relativeLayout, Gravity.CENTER, 0, 0);
}
});
有时候,你会在弹出View的时候按键变成选中状态,而点击了popupwindow外部区域其消失后,想按键恢复原来状态,就需要给popupwindow添加一个消失响应事件,这时可以重写 popupwindow.setOnDismissListener()这个方法:
pWindow_Jiaoju.setFocusable(true);
pWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.background));
pWindow.setOutsideTouchable(true);//有上面这几句,可以达到点击pWindow消失的效果
pWindow.showAtLocation(parent, Gravity.CENTER, 0, 0);
pWindow.setOnDismissListener(new OnDismissListener()
{
@Override
public void onDismiss()
{
// TODO Auto-generated method stub
//...code... }
});