总结如何实现Android浮动层,主要是dialog的使用。

自定义一个类继承自Dialog类,然后在构造方法中,定义这个dialog的布局和一些初始化信息。

案例1:

public class MenuDialog extends Dialog {public MenuDialog(Context context, boolean cancelable,            OnCancelListener cancelListener) {        super(context, cancelable, cancelListener);        // TODO Auto-generated constructor stub    }    public MenuDialog(Context context, int theme) {        super(context, theme);        // TODO Auto-generated constructor stub    }    public MenuDialog(Context context) {//dialog的视图风格        super(context, R.style.Theme_Transparent);//设置布局文件        setContentView(R.layout.menu_dialog);        //setTitle("Custom Dialog");//单击dialog之外的地方,可以dismiss掉dialog。        setCanceledOnTouchOutside(true);    // 设置window属性//        LayoutParams a = getWindow().getAttributes();//        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);//        a.gravity = Gravity.TOP;//        a.dimAmount = 1.0f; // 添加背景遮盖//        getWindow().setAttributes(a);                //在下面这种情况下,后台的activity不会被遮盖,也就是只会遮盖此dialog大小的部分        LayoutParams a = getWindow().getAttributes();        a.gravity = Gravity.TOP;        a.dimAmount = 0.0f; // 去背景遮盖        getWindow().setAttributes(a);//为你的对话框初始化数据        initMenu();    }}

然后再需要此dialog的地方,实例化这个dialog就行了。

另附此对话框的主题:

<style name="Theme.Transparent" parent="android:Theme">        <item name="android:windowBackground">@drawable/dialog_box_2</item>//此对话框的背景        <item name="android:windowIsTranslucent">true</item>//对话框是否透明        <item name="android:windowContentOverlay">@null</item>//对话框是否有遮盖        <item name="android:windowNoTitle">true</item>//对话框无标题        <item name="android:windowIsFloating">true</item>//对话框是否浮动        <item name="android:backgroundDimEnabled">false</item></style>

前几天更新了一下我手机上的百阅软件,上面的浮动对话框选择很好看,就模仿了一下。先看一下运行效果。

  主要原理是在dialog里扔进一个GridView,可以作为一个组件使用。源码如下


对话框使用的layout:grid_dialog.xml

<?xml version="1.0" encoding="utf-8"?>  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"                android:id="@+id/layout_root"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                >      <GridView android:id="@+id/mygridview"         android:numColumns="3"         android:gravity="center"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:padding="10dp"        android:verticalSpacing="20dp"        android:horizontalSpacing="10dp"        android:stretchMode="columnWidth"      >      </GridView>   </RelativeLayout>

对话框列表中的项目layout:grid_item.xml

<?xml version="1.0" encoding="utf-8"?>  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:id="@+id/RelativeLayout01"       android:layout_width="fill_parent"      android:layout_height="fill_parent"      android:gravity="center"      >           <ImageView android:id="@+id/item_image"         android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerHorizontal="true"        />                <TextView android:id="@+id/item_text"         android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@id/item_image"        android:layout_centerHorizontal="true"        android:text="@+id/item_text"/>    </RelativeLayout> 

自定义的对话框类:GridDialog.java

import java.util.ArrayList;  import java.util.HashMap;  import java.util.List;  import java.util.Map;    import android.app.Activity;  import android.app.Dialog;  import android.content.Context;  import android.content.Intent;  import android.view.Gravity;  import android.view.View;  import android.view.Window;  import android.view.WindowManager.LayoutParams;  import android.widget.AdapterView;  import android.widget.AdapterView.OnItemClickListener;  import android.widget.GridView;  import android.widget.SimpleAdapter;  import android.widget.Toast;      public class GridDialog extends Dialog {            private List<int[]> griditem = new ArrayList<int[]>();      {          griditem.add(new int[] { R.drawable.edit, R.string.edit });//图片资源,标题,可自己设定          griditem.add(new int[] { R.drawable.delete, R.string.delete });          griditem.add(new int[] { R.drawable.favsaddto, R.string.favsaddto });          griditem.add(new int[] { R.drawable.favs, R.string.favs });          griditem.add(new int[] { R.drawable.settings, R.string.settings });          griditem.add(new int[] { R.drawable.sync, R.string.sync });          griditem.add(new int[] { R.drawable.save, R.string.save });          griditem.add(new int[] { R.drawable.search, R.string.search });          griditem.add(new int[] { R.drawable.camera, R.string.camera });      };        private GridView gridview;        public GridDialog(Context context, boolean cancelable,              OnCancelListener cancelListener) {          super(context, cancelable, cancelListener);      }        public GridDialog(Context context, int theme) {          super(context, theme);      }        private void initGrid() {          List<Map<String, Object>> items = new ArrayList<Map<String, Object>>();            for (int[] item : griditem) {              Map<String, Object> map = new HashMap<String, Object>();              map.put("image", item[0]);              map.put("title", getContext().getString(item[1]));              items.add(map);          }            SimpleAdapter adapter = new SimpleAdapter(getContext(),                  items, // 列表内容                  R.layout.grid_item, new String[] { "title", "image" },                  new int[] { R.id.item_text, R.id.item_image });            gridview = (GridView) findViewById(R.id.mygridview);          // 为GridView设置数据          gridview.setAdapter(adapter);        }        public GridDialog(Context context) {            super(context);          requestWindowFeature(Window.FEATURE_NO_TITLE); // 灭掉对话框标题,要放在setContentView前面否则会报错            setContentView(R.layout.grid_dialog);            setCanceledOnTouchOutside(true);// 点击对话框外部取消对话框显示          LayoutParams lp = getWindow().getAttributes();          getWindow().setAttributes(lp);                    getWindow().addFlags(LayoutParams.FLAG_BLUR_BEHIND);// 添加模糊效果                    // 设置透明度,对话框透明(包括对话框中的内容)alpha在0.0f到1.0f之间。1.0完全不透明,0.0f完全透明          // lp.alpha = 0.5f;            lp.dimAmount = 0.1f;// 设置对话框显示时的黑暗度,0.0f和1.0f之间,在我这里设置成0.0f会出现黑屏状态,求解。            initGrid();// 添加表格按钮内容      }        /**      * 绑定事件到指定的Activity上      *       * @param activity      */      public void bindEvent(Activity activity) {            setOwnerActivity(activity);// )把对话框附着到一个Activity上            gridview.setOnItemClickListener(new OnItemClickListener() {                public void onItemClick(AdapterView<?> parent, View v,                      int position, long id) {                    switch (position) {// position从0开始,GridView中按钮的位置                  case 0:                      Toast.makeText(getContext(), "测试", Toast.LENGTH_SHORT)                              .show();                      break;                  }              }          });      }  } 

上面的代码没有实现active的跳转。如果想实现跳转采用下面方法:

private void redirect(Class<?> cls) {      if (getOwnerActivity().getClass() != cls) {//如果不是对话框绑定的active则跳转          dismiss();//关闭对话框          Intent intent = new Intent();          intent.setClass(getContext(), cls);          getContext().startActivity(intent);//跳转      }   }

对话框调用方法:

public class MainActivity extends Activity {      /** Called when the activity is first created. */      @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);         Button button=(Button) findViewById(R.id.Button01);          button.setOnClickListener(new Button.OnClickListener(){              @Override              public void onClick(View arg0) {                  GridDialog dialog=new GridDialog(MainActivity.this);                  dialog.bindEvent(MainActivity.this);                                    dialog.show();              }                                      });      }  } 

这个功能还是比较弱,比如无法动态增加按钮。这里为了简洁将一些style效果写到代码里了,还是写入xml里容易控制。

更多相关文章

  1. Android的标题栏
  2. Android(安卓)UI之对话框(dialog)
  3. AMD windows7安装和打开genymotion、android studio遇到的问题
  4. Android(安卓)UI开发第七篇之Android(安卓)Gallery
  5. Android控件Editext、TextView属性详解
  6. android强制横屏息屏后重新打开时会先显示竖屏
  7. android源代码编译
  8. android textview设置字体的行距和字间距
  9. Android(安卓)TextInputLayout 使用及其属性

随机推荐

  1. 开学第一课
  2. VS code下载安装插件以及http协议
  3. 0426php第一天
  4. 网站快速排名优化_企业站优化必读
  5. 学习第二天0629
  6. 0628作业
  7. html制作table
  8. 6/29号作业
  9. 商品信息表
  10. 前端开发环境搭建、编辑器插件安装、HTML