HardBirch

Android入门第十篇之PopupWindow

时间:10-10-21 栏目:安卓入门与提高 作者:张飞不张,文采横飞 评论:28 点击: 11,710 次

       介绍过AlertDialog之后,接下来就介绍一下PopupWindow这种对话框。PopupWindow是阻塞对话框,只有在外部线程 或者 PopupWindow本身做退出操作才行。PopupWindow完全依赖Layout做外观,在常见的开发中,PopupWindow应该会与AlertDialog常混用。

       贴出本例中运行的结果图:

main.xml的源码如下:









 

下图是PopupWindow弹出的截图,这里的PopupWindow是个登录框,点“确定”则自动填写,点“取消”则关闭PopupWindow。

 

popupwindow.xml的源码:

 

<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="#000000">

<TextView android:id="@+id/username_view"
android:layout_height="wrap_content"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip" android:text="用户名"
android:textAppearance="?android:attr/textAppearanceMedium" android:layout_width="fill_parent"/>

<EditText android:id="@+id/username_edit"
android:layout_height="wrap_content"
android:layout_width="fill_parent" android:layout_marginLeft="20dip"
android:layout_marginRight="20dip" android:capitalize="none"
android:textAppearance="?android:attr/textAppearanceMedium" />

<TextView android:id="@+id/password_view"
android:layout_height="wrap_content"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip" android:text="密码"
android:textAppearance="?android:attr/textAppearanceMedium" android:layout_width="fill_parent"/>

<EditText android:id="@+id/password_edit"
android:layout_height="wrap_content"
android:layout_width="fill_parent" android:layout_marginLeft="20dip"
android:layout_marginRight="20dip" android:capitalize="none"
android:password="true"
android:textAppearance="?android:attr/textAppearanceMedium" />

<LinearLayout android:id="@+id/LinearLayout01" android:layout_height="wrap_content" android:layout_width="fill_parent" android:gravity="center"><Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/BtnOK" android:layout_weight="100" android:text="确定"></Button><Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="100" android:text="取消" android:id="@+id/BtnCancel"></Button></LinearLayout>
</LinearLayout>

 

接下来是程序源码:

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.Editable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.PopupWindow;

public class testAlertDialog extends Activity {
Button btnPopupWindow;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//定义按钮
btnPopupWindow=(Button)this.findViewById(R.id.Button01);
btnPopupWindow.setOnClickListener(new ClickEvent());
}

//统一处理按键事件
class ClickEvent implements OnClickListener{

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(v==btnPopupWindow)
{
showPopupWindow(testAlertDialog.this,
testAlertDialog.this.findViewById(R.id.Button01));
}
}
}

public void showPopupWindow(Context context,View parent){
LayoutInflater inflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View vPopupWindow=inflater.inflate(R.layout.popupwindow, null, false);
final PopupWindow pw= new PopupWindow(vPopupWindow,300,300,true);

//OK按钮及其处理事件
Button btnOK=(Button)vPopupWindow.findViewById(R.id.BtnOK);
btnOK.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
//设置文本框内容
EditText edtUsername=(EditText)vPopupWindow.findViewById(R.id.username_edit);
edtUsername.setText("username");
EditText edtPassword=(EditText)vPopupWindow.findViewById(R.id.password_edit);
edtPassword.setText("password");
}
});

//Cancel按钮及其处理事件
Button btnCancel=(Button)vPopupWindow.findViewById(R.id.BtnCancel);
btnCancel.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
pw.dismiss();//关闭
}
});
//显示popupWindow对话框
pw.showAtLocation(parent, Gravity.CENTER, 0, 0);
}

}

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: Android入门第十篇之PopupWindow

Android入门第十篇之PopupWindow:目前有28 条留言

  1. 28楼
    kf156:

    [e01]虫哥文章必须顶

    2010-10-21 13:34 [回复]
  2. 27楼
    hmc1985:

    没想到亚日也来顶hellogv文章,看来我不顶不行了哟![e01]

    2010-10-21 13:48 [回复]
  3. 26楼
    teachertina:

    [e01]

    2010-12-02 12:21 [回复]
  4. 25楼
    tenseason:

    OnClickListener 改为 Button.OnClickListener

    是否我是2.2的原因?

    2010-12-08 19:10 [回复]
  5. 24楼
    xidiandj:

    不知道能否在popupwindow上点击botton再弹出一个popupwindow [e07]

    2010-12-17 00:33 [回复]
  6. 23楼
    luoxin395034:

    [e01]

    2011-01-15 20:20 [回复]
  7. 22楼
    qingfeng1985:

    [e01][e01][e01][e01]

    2011-02-23 11:00 [回复]
  8. [e01]

    2011-03-11 15:52 [回复]
  9. 20楼
    a222123:

    学习啦…

    2011-03-28 13:02 [回复]
  10. 19楼
    xljfor:

    [e01]

    2011-03-31 14:16 [回复]
  11. 你好,我想问一下:
    您把Acitvity转换为View,其中Activity里面是ListView控件,这时不会监听ListView的条目单击事件,要怎么做才能让其监听呢?

    2011-04-15 07:48 [回复]
  12. 17楼
    somelody:

    你好,我想问下在Android如何才能实现类似与非模态对话框的效果,在点击到对话框的界面范围时获得焦点?

    2011-04-24 10:24 [回复]
  13. 16楼
    hellogv:

    回复 somelody:
    你想通过这种对话框实现什么效果?

    2011-04-24 14:31 [回复]
  14. 15楼
    somelody:

    回复 hellogv:我在做一个东西,要实现视频框(对话框实现)的悬浮并且可以拖动,一个视频框的时候可以,因为只有它获得焦点。但是要是多个视频悬浮框的话,只有最后调用show()方法的那个对话框获得焦点,如何才能让点击到那个对话框获得焦点?

    2011-04-26 17:20 [回复]
  15. 14楼
    hellogv:

    回复 somelody:
    这个我迟点也会写在博客里,你先看看这个例子:
    http://dev.10086.cn/blog/?uid-3072-action-viewspace-itemid-6691

    2011-04-26 18:01 [回复]
  16. 13楼
    somelody:

    回复 hellogv:关键是 wmParams.flags=40;(参考http://blog.csdn.net/li_guotao/archive/2011/02/20/6196808.aspx),这样可以在多个对话框之间实现焦点的切换。

    2011-04-28 13:45 [回复]
  17. 12楼
    somelody:

    回复 hellogv:谢谢了! 通过创建dialog,其中有一个ImageButton来实现OnTouchListener(),获取touch事件的x和y坐标来移动Dialog,效果不错!

    2011-04-28 13:45 [回复]
  18. 11楼
    szjyy007:

    学习啦[e01]

    2011-05-18 17:29 [回复]
  19. 10楼
    momolvp:

    [e01]请问popupWndow怎么样实现拖动啊 我给pw加了个监听虽然 可以监听到鼠标移动 但根据算出的位移重新调用pw.showAtLocation中参数 貌似不起作用

    2011-06-14 21:44 [回复]
  20. 9楼
    hellogv:

    回复 momolvp:
    pw只能关了重开,才能改变位置

    2011-06-15 09:07 [回复]
  21. 8楼
    yy4040:

    PopupWindow 不是阻塞的吧!

    2011-07-22 17:08 [回复]
  22. 我写的popupwindow大家互相学习,呵呵,http://blog.csdn.net/wdaming1986/article/details/6636112

    2011-07-29 08:50 [回复]
  23. 6楼
    kkdelta:

    小伙子不错

    2011-08-11 16:32 [回复]
  24. 5楼
    bjwj8:

    请问一下如何在popupwindow里增加view视图啊?我想在popupwindow上画东西。

    2011-08-23 17:23 [回复]
  25. 4楼
    oceanZhao:

    嗯,不错的啊。。。

    2011-08-31 09:04 [回复]
  26. 膜拜楼主

    2011-09-23 16:13 [回复]
  27. 板凳
    liuwei2012:

    学习了

    2011-11-05 16:01 [回复]
  28. 沙发
    guhuaijian:

    PopupWindow 号称是阻塞对话框,用win32的思想理解,就是所谓的模态对话框吧

    2012-02-13 17:48 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐