QQ空间实现(二)—— 分享功能 / 弹出PopupWindow

这是一张QQ空间说说详情的截图。

分析:

1、点击右上角三个点的图标,在界面底部弹出一个区域,这个区域有一些按钮提供给我们操作
2、当该区域出现的时候,详情界面便灰了,也说成透明度变化了
3、当任意选了一个按钮或者点击了该区域以外的部分,该区域消失,灰色界面变回亮白色,并执行点击的按钮对应的操作

显然,这个功能我们需要用PopupWindow实现更好~

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

下面通过一个Demo来实现这个需求~~

效果图:

首先还是布局文件:

1、主界面:

我们只需要在界面的右上角放一个按钮来弹出PopupWindow ,注意 父容器需要有一个id,因为我们需要它来给PopupWindow设置弹出的位置

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:id="@+id/mainlayout"
    >

    <ImageButton
        android:id="@+id/btn_more"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/btn_more"
        android:background="#0000"
        android:layout_alignParentRight="true"
        android:layout_margin="5dp"
        />

</RelativeLayout>

2、PopupWindow界面

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:orientation="vertical"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_gravity="center_vertical|center"
        android:background="@drawable/shape_rectangle_white"
        android:orientation="vertical" >
        <TextView
            android:id="@+id/shareto"
            android:layout_width="match_parent"
            android:layout_height="35dp"
            android:gravity="center"
            android:layout_gravity="center_horizontal"
            android:text="分享到"
            android:textSize="15sp"
             />

            <LinearLayout
                android:id="@+id/fp_linear_share"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:layout_marginBottom="5dp">

                <LinearLayout
                    android:id="@+id/fp_linear_sharetoWeixin"
                    android:layout_weight="1"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:gravity="center_horizontal"
                    >
                    <ImageView
                        android:layout_width="55dp"
                        android:layout_height="55dp"
                        android:background="@mipmap/ic_launcher"
                        android:layout_gravity="bottom|center_horizontal"/>
                    <TextView
                        android:layout_marginTop="4dp"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="微信联系人"
                        android:gravity="center"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/fp_linear_sharetoquan"
                    android:layout_weight="1"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:gravity="center_horizontal"
                    >
                    <ImageView
                        android:layout_width="55dp"
                        android:layout_height="55dp"
                        android:background="@mipmap/ic_launcher"
                        android:layout_gravity="bottom|center_horizontal"/>
                    <TextView
                        android:layout_marginTop="4dp"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="微信朋友圈"
                        android:gravity="center"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/fp_linear_sharetoQzone"
                    android:layout_weight="1"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:gravity="center_horizontal"
                    >
                    <ImageView
                        android:layout_width="55dp"
                        android:layout_height="55dp"
                        android:background="@mipmap/ic_launcher"
                        android:layout_gravity="bottom|center_horizontal"/>
                    <TextView
                        android:layout_marginTop="4dp"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="QQ空间"
                        android:gravity="center"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/fp_linear_sharetoQQ"
                    android:layout_weight="1"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:gravity="center_horizontal"
                    >
                    <ImageView
                        android:layout_width="55dp"
                        android:layout_height="55dp"
                        android:background="@mipmap/ic_launcher"
                        android:layout_gravity="bottom|center_horizontal"/>
                    <TextView
                        android:layout_marginTop="4dp"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="QQ好友"
                        android:gravity="center"
                        />
                </LinearLayout>

            </LinearLayout>

            <View
                android:layout_marginTop="20dp"
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="#e8e8e8" />

        <LinearLayout
            android:id="@+id/fp_other"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_marginTop="25dp"
            android:layout_marginBottom="5dp">
            <LinearLayout
                android:id="@+id/fp_report"
                android:layout_weight="1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center_horizontal"
                >
                <ImageView
                    android:layout_width="55dp"
                    android:layout_height="55dp"
                    android:background="@mipmap/ic_launcher"
                    android:layout_gravity="bottom|center_horizontal"/>
                <TextView
                    android:layout_marginTop="4dp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="举报"
                    android:gravity="center"
                    />
            </LinearLayout>
            <LinearLayout
                android:id="@+id/fp_hide_all"
                android:layout_weight="1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center_horizontal"
                >
                <ImageView
                    android:layout_width="55dp"
                    android:layout_height="55dp"
                    android:background="@mipmap/ic_launcher"
                    android:layout_gravity="bottom|center_horizontal"/>
                <TextView
                    android:layout_marginTop="4dp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="屏蔽此人"
                    android:gravity="center"
                    />
            </LinearLayout>
            <LinearLayout
                android:id="@+id/fp_hide_pic"
                android:layout_weight="1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center_horizontal"
                >
                <ImageView
                    android:layout_width="55dp"
                    android:layout_height="55dp"
                    android:background="@mipmap/ic_launcher"
                    android:layout_gravity="bottom|center_horizontal"/>
                <TextView
                    android:layout_marginTop="4dp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="屏蔽此照片"
                    android:gravity="center"
                    />
            </LinearLayout>

            <LinearLayout
                android:layout_weight="1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center_horizontal"
                >
                <ImageView
                    android:layout_width="55dp"
                    android:layout_height="55dp"
                    android:layout_gravity="bottom|center_horizontal"/>
                <TextView
                    android:layout_marginTop="4dp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    />
            </LinearLayout>

        </LinearLayout>
            <View

                android:layout_width="match_parent"
                android:layout_height="0.5dp"
                android:background="#e8e8e8" />
            <TextView
                android:id="@+id/fp_cancel"
                android:layout_width="fill_parent"
                android:layout_height="50dp"
                android:gravity="center"
                android:text="取消"
                android:textSize="17sp" />
    </LinearLayout>
</RelativeLayout>

popupwindow

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

java代码部分:

1、首先我们要自定义一个继承PopupWindow的类(根据项目需求决定定义的内容)/**

 * 自定义PopupWindow , 实现仿QQ空间分享效果
 */
public class SelectPopupWindow extends PopupWindow {

    //一个LinearLayout 表示一个可选操作
    private LinearLayout fp_hide_all,fp_hide_pic,fp_report,fp_linear_sharetoWeixin,fp_linear_sharetoquan,fp_linear_sharetoQzone,fp_linear_sharetoQQ;
    //popupWindow 取消文本按钮
    private TextView fp_cancel;
    private View mMenuView;
    public SelectPopupWindow(Activity context, OnClickListener itemsOnClick) {
        super(context);
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mMenuView = inflater.inflate(R.layout.feed_popuwindow, null);
        fp_hide_pic = (LinearLayout) mMenuView.findViewById(R.id.fp_hide_pic);
        fp_hide_all = (LinearLayout) mMenuView.findViewById(R.id.fp_hide_all);
        fp_report = (LinearLayout) mMenuView.findViewById(R.id.fp_report);
        fp_linear_sharetoWeixin = (LinearLayout) mMenuView.findViewById(R.id.fp_linear_sharetoWeixin);
        fp_linear_sharetoquan = (LinearLayout) mMenuView.findViewById(R.id.fp_linear_sharetoquan);
        fp_linear_sharetoQzone = (LinearLayout) mMenuView.findViewById(R.id.fp_linear_sharetoQzone);
        fp_linear_sharetoQQ = (LinearLayout) mMenuView.findViewById(R.id.fp_linear_sharetoQQ);
        fp_cancel = (TextView) mMenuView.findViewById(R.id.fp_cancel);
        //点击取消按钮,关闭popupWindow
        fp_cancel.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
        fp_hide_pic.setOnClickListener(itemsOnClick);
        fp_hide_all.setOnClickListener(itemsOnClick);
        fp_report.setOnClickListener(itemsOnClick);
        fp_linear_sharetoWeixin.setOnClickListener(itemsOnClick);
        fp_linear_sharetoquan.setOnClickListener(itemsOnClick);
        fp_linear_sharetoQzone.setOnClickListener(itemsOnClick);
        fp_linear_sharetoQQ.setOnClickListener(itemsOnClick);

        this.setContentView(mMenuView);
        this.setWidth(LayoutParams.MATCH_PARENT);
        this.setHeight(LayoutParams.WRAP_CONTENT);
        ColorDrawable dw = new ColorDrawable(0x000000);
        this.setBackgroundDrawable(dw);
        this.setFocusable(true);            //点击popupWindow之外的部分  关闭popupWindow
        mMenuView.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                int height = mMenuView.findViewById(R.id.fp_linear_share).getTop();
                int y = (int) event.getY();
                if (event.getAction() == MotionEvent.ACTION_UP){
                    if(y<height){
                        dismiss();
                    }
                }
                return true;
            }
        });
    }
    // 可自主添加其他功能需求方法
}

最后看MainActivity.java

public class MainActivity extends Activity implements View.OnClickListener {    // 自定义PopupWindow    private SelectPopupWindow feedSelectPopupWindow;    // 界面父容器    private RelativeLayout relativeLayout;    // 打开popupWindow的按钮    private ImageButton btn_more;

    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        relativeLayout = (RelativeLayout) findViewById(R.id.mainlayout);        btn_more = (ImageButton) findViewById(R.id.btn_more);        btn_more.setOnClickListener(this);    }

    // popupWindow 点击事件监听    private View.OnClickListener selectItemsOnClick = new View.OnClickListener() {        public void onClick(View v) {            switch (v.getId()) {                //根据popupWindow 布局文件中的id 来执行相应的点击事件                case R.id.fp_linear_sharetoWeixin:                    Toast.makeText(MainActivity.this,"点击了微信分享",Toast.LENGTH_SHORT).show();                    break;                // ....            }            //每次点击popupWindow中的任意按钮,记得关闭此popupWindow,            feedSelectPopupWindow.dismiss();        }    };

    /**     * 设置添加屏幕的背景透明度     * @param bgAlpha     */    public void backgroundAlpha(float bgAlpha)    {        WindowManager.LayoutParams lp = getWindow().getAttributes();        lp.alpha = bgAlpha; //0.0-1.0        getWindow().setAttributes(lp);    }

    @Override    public void onClick(View v) {        switch (v.getId()) {            //点击分享按钮,弹出PopupWindow            case R.id.btn_more:                feedSelectPopupWindow = new SelectPopupWindow(this, selectItemsOnClick);                // 设置popupWindow显示的位置                // 此时设在界面底部并且水平居中                feedSelectPopupWindow.showAtLocation(relativeLayout,                        Gravity.BOTTOM| Gravity.CENTER_HORIZONTAL, 0, 0);                // 当popupWindow 出现的时候 屏幕的透明度  ,设为0.5 即半透明 灰色效果                backgroundAlpha(0.5f);                // 设置popupWindow取消的点击事件,即popupWindow消失后,屏幕的透明度,全透明,就回复原状态                feedSelectPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {                    @Override                    public void onDismiss() {                        backgroundAlpha(1f);                    }                });                break;        }    }}

注意点:

如果你在你自己的项目中使用了弹出PopupWindow,报错如下:

 Unable to add window -- token null is not valid; is your activity running?

一般是错误在 .showAtLocation()方法上,那么要注意PopupWindow和Dialog一样是需要依赖于Activity存在的

所以不要在onCreate()方法中使用 .showAtLocation()方法 ,因为这个时候Activity还没有Create()完成

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

相关知识:

QQ空间实现(一)—— 展示说说中的评论内容并有相应点击事件

博主现在从事社交类社区类APP开发,有同领域的朋友欢迎关注交流~~~

时间: 2024-10-08 04:56:12

QQ空间实现(二)—— 分享功能 / 弹出PopupWindow的相关文章

Android项目实战(十七):QQ空间实现(二)—— 分享功能 / 弹出PopupWindow

原文:Android项目实战(十七):QQ空间实现(二)-- 分享功能 / 弹出PopupWindow 这是一张QQ空间说说详情的截图. 分析: 1.点击右上角三个点的图标,在界面底部弹出一个区域,这个区域有一些按钮提供给我们操作 2.当该区域出现的时候,详情界面便灰了,也说成透明度变化了 3.当任意选了一个按钮或者点击了该区域以外的部分,该区域消失,灰色界面变回亮白色,并执行点击的按钮对应的操作 显然,这个功能我们需要用PopupWindow实现更好~ --------------------

Android-实现底部弹出PopupWindow并让背景逐渐变暗

Android-实现底部弹出PopupWindow并让背景逐渐变暗 在android开发中,经常需要通过点击某个按钮弹出对话框或者选择框,通过Dialog或者PopupMenu.PopupWindow都能实现. 这里主要介绍后两者:PopupMenu.PopupWindow的实现. 先看两个效果图左边PopupMenu,右边PopupWindow: Android-实现底部弹出PopupWindow并让背景逐渐变暗 一PopupMenu实现 二PopupWindow实现 一.PopupMenu实

弹出PopupWindow背景变暗的实现

弹出PopuoWindow后 代码里设置的是PopupWindow默认获取焦点 所以PopupWindow显示的时候其它控件点击是没有反应的 用到的方法是 pwMyPopWindow.setFocusable(true); 代码里还设置了 pwMyPopWindow.setBackgroundDrawable(this.getResources().getDrawable( R.mipmap.ic_launcher));// 设置背景图片,不能在布局中设置,要通过代码来设置pwMyPopWind

PopupWindow-----点击弹出 PopupWindow 初始化菜单

/** * 点击弹出 PopupWindow 初始化菜单 */ private void initPopupWindow() { PopupWindowAdapter adapter = new PopupWindowAdapter(); mPopDisplay.setAdapter(adapter); //mPopDisplay 是mPopView 中的listview if (mPopupWindow == null) { // mPopView view对象xml文件 mPopupWind

百度地图开发-将多个地点标记在地图上,点击节点弹出PopupWindow

最近在写一个安卓程序,用到了百度地图API的一些内容,就随便玩耍了一下. 这个DEMO是用来将多个地点标记在地图上,然后点击节点弹出PopupWindow 下面是一些截图: main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout

移动端二维码弹出框,自适应屏幕尺寸

qrcode box,一个小小的二维码工具,通过调用它,可以在页面中间弹出一个二维码窗口,主要是面向移动设备的,对于PC端浏览器而言,百度分享和JiaThis已经做的很好了. qrcode box有啥特点呢? 它能够自动适应屏幕,并且不受移动设备横屏.竖屏切换的干扰. 同时,无论是横屏的pad设备,还是竖屏的phone设备,qrcode box均有良好表现. 但是,qrcode box并不是完全响应式的,它的尺寸不会跟随屏幕可视区尺寸变化而变化,因为这貌似没什么用(至少对于移动设备而言用处不大)

QQ 国际版(International version) - 关闭弹出资讯

1,打开QQ面板,点击左下角的 "企鹅"图标.选择 "Setting". 2,在弹出的 "Setting"面板中,选择 "Privacy" 选项卡下的 "Today",并在右侧对应的内容中,去掉 'Show "Today" after login' 复选框,即可.

从仿QQ消息提示框来谈弹出式对话框

<代码里的世界> -UI篇 用文字札记描绘自己 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/45896477 [导航] - 自定义弹出式对话框的简单用法 列举各种常见的对话框实现方案 1.概述 android原生控件向来以丑著称(新推出的Material Design当另说),因此几乎所有的应用都会特殊定制自己的UI样式.而其中弹出式提示框的定制尤为常见,本篇我们将从模仿QQ退出提示框来看一

QQ空间爬虫最新分享,一天 400 万条数据(附代码地址)

http://mp.weixin.qq.com/s?__biz=MzAxMjUyNDQ5OA==&mid=2653552228&idx=1&sn=e476bf23556406cbce7de65508d79843&chksm=806dd0d9b71a59cf2b062a19309c849a62ba15790898e5e619205f0f5ec84a90025a8cea05e9&mpshare=1&scene=23&srcid=11252MeE6Qu1D