当前位置:   article > 正文

Android popupwindow 和 Activity弹出窗口实现方式_安卓开发中如何将url作为弹出窗口

安卓开发中如何将url作为弹出窗口
Android的对话框有两种:PopupWindow和AlertDialog。它们的不同点在于:

AlertDialog的位置固定,而PopupWindow的位置可以随意

AlertDialog是非阻塞线程的,而PopupWindow是阻塞线程的

PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件。

具体如下:

       showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移 

       showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移

       showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移

  1. /**
  2. * 弹出menu菜单
  3. */
  4. public void menu_press(){
  5. if(!menu_display){
  6. //获取LayoutInflater实例
  7. inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
  8. //这里的main布局是在inflate中加入的哦,以前都是直接this.setContentView()的吧?呵呵
  9. //该方法返回的是一个View的对象,是布局中的根
  10. layout = inflater.inflate(R.layout.main_menu, null);
  11. //下面我们要考虑了,我怎样将我的layout加入到PopupWindow中呢???很简单
  12. menuWindow = new PopupWindow(layout,LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); //后两个参数是width和height
  13. //menuWindow.showAsDropDown(layout); //设置弹出效果
  14. //menuWindow.showAsDropDown(null, 0, layout.getHeight());
  15. //设置如下四条信息,当点击其他区域使其隐藏,要在show之前配置
  16. menuWindow.setFocusable(true);
  17. menuWindow.setOutsideTouchable(true);
  18. menuWindow.update();
  19. menuWindow.setBackgroundDrawable(new BitmapDrawable());
  20. mClose = (LinearLayout)layout.findViewById(R.id.menu_close);
  21. menuWindow.showAtLocation(this.findViewById(R.id.schoolmain), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0,50); //设置layout在PopupWindow中显示的位置
  22. //如何获取我们main中的控件呢?也很简单
  23. mMainbtn = (LinearLayout)layout.findViewById(R.id.menu_main_btn);
  24. mHistorybtn = (LinearLayout) layout.findViewById(R.id.menu_history_btn);
  25. mHelpbtn = (LinearLayout) layout.findViewById(R.id.menu_help_btn);
  26. //下面对每一个Layout进行单击事件的注册吧。。。
  27. //比如单击某个MenuItem的时候,他的背景色改变
  28. //事先准备好一些背景图片或者颜色
  29. mMainbtn.setOnClickListener (new View.OnClickListener() {
  30. @Override
  31. public void onClick(View arg0) {
  32. mywebView.loadUrl(URL);
  33. menuWindow.dismiss(); //响应点击事件之后关闭Menu
  34. }
  35. });
  36. mHelpbtn.setOnClickListener (new View.OnClickListener() {
  37. @Override
  38. public void onClick(View arg0) {
  39. mywebView.loadUrl(URL);
  40. menuWindow.dismiss(); //响应点击事件
  41. }
  42. });
  43. mHistorybtn.setOnClickListener (new View.OnClickListener() {
  44. @Override
  45. public void onClick(View arg0) {
  46. mywebView.loadUrl(URL);
  47. menuWindow.dismiss(); //响应点击事件
  48. }
  49. });
  50. menu_display = true;
  51. }else{
  52. //如果当前已经为显示状态,则隐藏起来
  53. menuWindow.dismiss();
  54. menu_display = false;
  55. }
  56. }
  57. public void back_press(){
  58. if(menu_display){ //如果 Menu已经打开 ,先关闭Menu
  59. menuWindow.dismiss();
  60. menu_display = false;
  61. }
  62. else {
  63. Intent intent = new Intent();
  64. intent.setClass(MainActivity.this,Exit.class);
  65. startActivity(intent);
  66. }
  67. }

这种方法很简单,要注意的是如果要想点击其他地方使其隐藏,要在show设置四条属性如下:
// 使其聚焦
mPopupWindow.setFocusable(true);
// 设置允许在外点击消失
mPopupWindow.setOutsideTouchable(true);
//刷新状态
mPopupWindow.update();
//点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作
mPopupWindow.setBackgroundDrawable(new BitmapDrawable()); 

-------------------------------------------------------------------

Activity伪窗口



java代码——Exit.java

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.view.MotionEvent;
  4. import android.view.View;
  5. import android.view.View.OnClickListener;
  6. import android.widget.LinearLayout;
  7. import android.widget.Toast;
  8. public class Exit extends Activity {
  9. private LinearLayout layout;
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.exit_dialog);
  14. layout=(LinearLayout)findViewById(R.id.exit_layout);
  15. layout.setOnClickListener(new OnClickListener() {
  16. @Override
  17. public void onClick(View v) {
  18. // TODO Auto-generated method stub
  19. Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",
  20. Toast.LENGTH_SHORT).show();
  21. }
  22. });
  23. }
  24. @Override
  25. public boolean onTouchEvent(MotionEvent event){
  26. finish();
  27. return true;
  28. }
  29. public void exitbutton1(View v) {
  30. this.finish();
  31. }
  32. public void exitbutton0(View v) {
  33. this.finish();
  34. MainWeixin.instance.finish();//关闭Main 这个Activity
  35. }
  36. }

布局文件:exit_dialog.xml 
  1. View Code
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:id="@+id/exit_layout"
  5. android:layout_width="280dp"
  6. android:layout_height="wrap_content"
  7. android:gravity="center_horizontal"
  8. android:orientation="vertical"
  9. android:background="@drawable/confirm_dialog_bg2" >
  10. <TextView
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:layout_marginTop="4dp"
  14. android:padding="5dp"
  15. android:textColor="#333"
  16. android:textSize="20sp"
  17. android:text="退出微信" />
  18. <TextView
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:textColor="#333"
  22. android:layout_marginTop="1dp"
  23. android:padding="10dp"
  24. android:textSize="16sp"
  25. android:gravity="center_horizontal"
  26. android:text="退出后,你将收不到新的消\n息.确定要退出?" />
  27. <LinearLayout
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:layout_marginTop="33dp"
  31. android:layout_marginBottom="8dp"
  32. >
  33. <Button
  34. android:id="@+id/exitBtn0"
  35. android:layout_width="110dp"
  36. android:layout_height="wrap_content"
  37. android:text="是"
  38. android:textSize="16sp"
  39. android:textColor="#fff"
  40. android:background="@drawable/btn_style_green"
  41. android:gravity="center"
  42. android:onClick="exitbutton0"
  43. />
  44. <Button
  45. android:id="@+id/exitBtn1"
  46. android:layout_width="110dp"
  47. android:layout_height="wrap_content"
  48. android:layout_marginLeft="10dp"
  49. android:text="否"
  50. android:textSize="16sp"
  51. android:textColor="#333"
  52. android:background="@drawable/btn_style_white"
  53. android:gravity="center"
  54. android:onClick="exitbutton1"
  55. />
  56. </LinearLayout>
  57. </LinearLayout>

分析,弹出exit这个框很简单,本身就是activity,在主界面用startavtivity等方法像普通activity启动。
关键是如何做到点击其他地方退出和如何关闭程序。
、点击其他地方退出,只要监听OnClickListener让所有的点击都退出就行了(除了xml中指定按钮事件之外)。
、退出主程序。只要在出程序中将主程序自己设置成静态对象,在外部调用即可 public static MainWeixin instance=null;
上面的布局和activity并不能将activity的窗体展现在主界面之上,看起来像个弹出框。下面是弹出框的 styles

  1. <style name="MyDialogStyle">
  2. <item name="android:windowBackground">@android:color/transparent</item>
  3. <item name="android:windowFrame">@null</item>
  4. <item name="android:windowNoTitle">true</item>
  5. <item name="android:windowIsFloating">true</item>
  6. <item name="android:windowIsTranslucent">true</item>
  7. <item name="android:windowContentOverlay">@null</item>
  8. <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
  9. <item name="android:backgroundDimEnabled">true</item>
  10. </style>

下面我们来分析一下这个布局的含义及重点:
重点1、<item name="android:windowBackground">@android:color/transparent</item>窗口背景色
重点2、<item name="android:windowFrame">@null</item>Dialog的windowFrame框为无
重点4、<item name="android:windowIsFloating">true</item>是否浮现在activity之上
重点5、<item name="android:windowIsTranslucent">true</item>窗口是否半透明——是(与第一条配合使用)
重点6、<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>窗口弹出效果
重点7、<item name="android:backgroundDimEnabled">true</item> 是否允许背景模糊
重点8、<item name="android:windowContentOverlay">@null</item>这个不设置的话,可能会出现边框黑线 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/225218
推荐阅读
相关标签
  

闽ICP备14008679号