android dialog菜单,Android中Dialog自定义上下文花式菜单

这是一个类似于QQ里面长按消息弹出菜单的效果,菜单跟着item动

闲话不说,上代码

先自定义一个Dialog

import android.app.Dialog;

import android.content.Context;

import android.os.Bundle;

import android.view.View;

import android.widget.TextView;

import io.dcloud.H5B79C397.R;

/**

* Created by Administrator on 2017/9/19 0019.

*/

public class SelfDialog extends Dialog {

private TextView copy;//确定按钮

private TextView del;//取消按钮

private onNoOnclickListener noOnclickListener;//取消按钮被点击了的监听器

private onYesOnclickListener yesOnclickListener;//确定按钮被点击了的监听器

public SelfDialog(Context context) {

super(context, R.style.MyDialog);

}

public void setNoOnclickListener(String str, onNoOnclickListener onNoOnclickListener) {

if (str != null) {

//noStr = str;

}

this.noOnclickListener = onNoOnclickListener;

}

public void setYesOnclickListener(String str, onYesOnclickListener onYesOnclickListener) {

if (str != null) {

//yesStr = str;

}

this.yesOnclickListener = onYesOnclickListener;

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.layout_noticeactivity_dialog);

//按空白处不能取消动画

setCanceledOnTouchOutside(true);

//初始化界面控件

initView();

//初始化界面数据

//初始化界面控件的事件

initEvent();

}

private void initEvent() {

//设置确定按钮被点击后,向外界提供监听

del.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (yesOnclickListener != null) {

yesOnclickListener.onYesClick();

}

}

});

//设置取消按钮被点击后,向外界提供监听

copy.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (noOnclickListener != null) {

noOnclickListener.onNoClick();

}

}

});

}

private void initView() {

del = (TextView) findViewById(R.id.del);

copy = (TextView) findViewById(R.id.text);

}

public interface onYesOnclickListener {

public void onYesClick();

}

public interface onNoOnclickListener {

public void onNoClick();

}

}

然后看Dialog里面的布局文件

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="horizontal">

android:text="复制"

android:clickable="true"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/text"

android:drawableTop="@mipmap/collect"/>

android:layout_marginLeft="15dp"

android:clickable="true"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="删除"

android:id="@+id/del"

android:drawableTop="@mipmap/myself"/>

还给Dialog设置了一个样式

@android:color/transparent

true

@null

true

false

然后看主代码

public class MenuTestActivity extends Activity {

private ListView listView;

private SelfDialog selfDialog;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_menu_test);

listView = (ListView) findViewById(R.id.list);

final ArrayAdapter adapter = new ArrayAdapter(MenuTestActivity.this, android.R.layout.simple_list_item_1);

adapter.add("1");

adapter.add("1");

adapter.add("1");

adapter.add("1");

adapter.add("1");

adapter.add("1");

adapter.add("1");

adapter.add("1");

adapter.add("1");

adapter.add("1");

adapter.add("1");

adapter.add("1");

adapter.add("1");

adapter.add("1");

adapter.add("1");

listView.setAdapter(adapter);

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

@Override

public boolean onItemLongClick(final AdapterView> parent, final View view, final int position, long id) {

int[] location = new int[2];

// parent.getItemAtPosition(position).getLocationOnScreen(location);

view.getLocationOnScreen(location);//当前item的坐标

int x = location[0];

int y = location[1];

System.out.println("x:"+x+"y:"+y);//获取控件位置坐标可采用以上方法

selfDialog = new SelfDialog(MenuTestActivity.this);

// Window window = selfDialog.getWindow();

// window.setContentView(view);

Window dialogWindow = selfDialog.getWindow();

WindowManager.LayoutParams lp = dialogWindow.getAttributes();

dialogWindow.setGravity(Gravity.LEFT | Gravity.TOP);

lp.x = location[0]+80; // 新位置X坐标

lp.y = location[1]-30; // 新位置Y坐标

// 当Window的Attributes改变时系统会调用此函数,可以直接调用以应用上面对窗口参数的更改,也可以用setAttributes

// dialog.onWindowAttributesChanged(lp);

dialogWindow.setAttributes(lp);

selfDialog.setCanceledOnTouchOutside(true);// 设置点击屏幕Dialog不消失

selfDialog.setYesOnclickListener("确定", new SelfDialog.onYesOnclickListener() {

@Override

public void onYesClick() {

Toast.makeText(MenuTestActivity.this, adapter.getItem(position), Toast.LENGTH_LONG).show();

selfDialog.dismiss();

}

});

selfDialog.setNoOnclickListener("取消", new SelfDialog.onNoOnclickListener() {

@Override

public void onNoClick() {

Toast.makeText(MenuTestActivity.this, adapter.getItem(position), Toast.LENGTH_LONG).show();

selfDialog.dismiss();

}

});

selfDialog.show();

return true;

}

});

}

}

主程序的布局

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="io.dcloud.H5B79C397.testActivity.MenuTestActivity">

android:layout_width="match_parent"

android:layout_height="match_parent"

android:id="@+id/list">

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值