总结如何实现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>

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

Android:实现一种浮动选择菜单的效果

  主要原理是在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 studio 点击按钮跳转到新的Activity
  2. Android中ImageButton自定义按钮的按下效果的代码实现方法,附网上
  3. Android UI之对话框(dialog)
  4. android 图片切换,仿百叶窗效果
  5. android 中给图片加圆角效果
  6. Android实现为GridView添加边框效果
  7. Android 对话框(Dialog)【大全】
  8. android 按钮倒计时读秒

随机推荐

  1. Android 全局异常捕捉 + 本地异常日志
  2. Android图像处理之熔铸特效
  3. Android 按键处理
  4. android MediaRecorder录音详解
  5. android中PopupWindow的使用详解
  6. android 日期选择控件 DatePicker
  7. Android 检测正在运行的service
  8. Android Layout Tricks #1(Android 布局技
  9. android保存第一次安装状态并初始化数据
  10. Android URL访问网络资源,通过URL加载网络