Android中使用PopupWindow 仿微信點(diǎn)贊和評(píng)論彈出
微信朋友圈的點(diǎn)贊和評(píng)論功能,有2個(gè)組成部分:左下角的“更多”按鈕;點(diǎn)擊該按鈕后彈出的對(duì)話框;

PopupWindow,彈出框使用PopupWindow實(shí)現(xiàn),這是點(diǎn)贊和評(píng)論的載體,具體要涉及 PopupWindow 點(diǎn)擊非窗口位置和再次點(diǎn)擊消失以及顯示位置的問(wèn)題(根據(jù)相應(yīng)更多按鈕的位置確定 PopupWindow 的顯示位置
package com.example.cmm.helloworld;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private PopupWindow mMorePopupWindow;
private int mShowMorePopupWindowWidth;
private int mShowMorePopupWindowHeight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView) findViewById(R.id.listview);
lv.setAdapter(new MyAdapter(MainActivity.this, getData()));
}
private List<Data> getData() {
List<Data> data = new ArrayList<>();
data.add(new Data(R.drawable.xiaona, "薄荷栗", "我學(xué)過(guò)跆拳道,都給我跪下唱征服", "昨天"));
data.add(new Data(R.drawable.xueyan, "欣然", "走遍天涯海角,唯有我家風(fēng)景最好,啊哈哈", "昨天"));
data.add(new Data(R.drawable.leishao, "陳磊_CL", "老子以后要當(dāng)行長(zhǎng)的,都來(lái)找我借錢(qián)吧,now", "昨天"));
data.add(new Data(R.drawable.yuhong, "永恒依然", "房子車(chē)子都到碗里來(lái)", "昨天"));
data.add(new Data(R.drawable.lanshan, "藍(lán)珊", "你們這群傻×,我笑而不語(yǔ)", "昨天"));
return data;
}
class MyAdapter extends BaseAdapter {
private List<Data> listdata;
private Context context;
public MyAdapter(Context context, List<Data> listdata) {
this.context = context;
this.listdata = listdata;
}
@Override
public int getCount() {
return listdata.size();
}
@Override
public Object getItem(int arg0) {
return listdata.get(arg0);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.listview_item, null, false);
// 帶賦值區(qū)域
ImageView ivPortrait = (ImageView) convertView.findViewById(R.id.portrait);
TextView tvNickName = (TextView) convertView.findViewById(R.id.nick_name);
TextView tvContent = (TextView) convertView.findViewById(R.id.content);
TextView tvCreatedAt = (TextView) convertView.findViewById(R.id.created_at);
ImageView moreBtn = (ImageView) convertView.findViewById(R.id.more_btn);
// 賦值
Data data = listdata.get(position);
ivPortrait.setImageResource(data.getPortraitId());
tvNickName.setText(data.getNickName());
tvContent.setText(data.getContent());
tvCreatedAt.setText(data.getCreatedAt());
// 更多按鈕的點(diǎn)擊事件
moreBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showMore(v);
}
});
return convertView;
}
/**
* 彈出點(diǎn)贊和評(píng)論框
*
* @param moreBtnView
*/
private void showMore(View moreBtnView) {
if (mMorePopupWindow == null) {
LayoutInflater li = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View content = li.inflate(R.layout.layout_more, null, false);
mMorePopupWindow = new PopupWindow(content, ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
mMorePopupWindow.setBackgroundDrawable(new BitmapDrawable());
mMorePopupWindow.setOutsideTouchable(true);
mMorePopupWindow.setTouchable(true);
content.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
mShowMorePopupWindowWidth = content.getMeasuredWidth();
mShowMorePopupWindowHeight = content.getMeasuredHeight();
View parent = mMorePopupWindow.getContentView();
TextView like = (TextView) parent.findViewById(R.id.like);
TextView comment = (TextView) parent.findViewById(R.id.comment);
// 點(diǎn)贊的監(jiān)聽(tīng)器
like.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
alert.setTitle("點(diǎn)贊");
alert.setNegativeButton("取消", null);
alert.show();
}
});
// 評(píng)論的監(jiān)聽(tīng)器
comment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
alert.setTitle("評(píng)論");
alert.setNegativeButton("取消", null);
alert.show();
}
});
}
if (mMorePopupWindow.isShowing()) {
mMorePopupWindow.dismiss();
} else {
int heightMoreBtnView = moreBtnView.getHeight();
mMorePopupWindow.showAsDropDown(moreBtnView, -mShowMorePopupWindowWidth,
-(mShowMorePopupWindowHeight + heightMoreBtnView) / 2);
}
}
}
class Data {
private int portraitId; // 頭像
private String nickName; // 昵稱(chēng)
private String content; // 說(shuō)說(shuō)
private String createdAt; // 發(fā)布時(shí)間
public Data(int portraitId, String nickName, String content, String createdAt) {
this.portraitId = portraitId;
this.nickName = nickName;
this.content = content;
this.createdAt = createdAt;
}
public int getPortraitId() {
return portraitId;
}
public String getNickName() {
return nickName;
}
public String getContent() {
return content;
}
public String getCreatedAt() {
return createdAt;
}
}
}
以上所述是小編給大家介紹的Android中使用PopupWindow 仿微信點(diǎn)贊和評(píng)論彈出,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android 仿微信朋友圈點(diǎn)贊和評(píng)論彈出框功能
- 簡(jiǎn)單實(shí)用的Android UI微博動(dòng)態(tài)點(diǎn)贊效果
- Android高級(jí)UI特效仿直播點(diǎn)贊動(dòng)畫(huà)效果
- Android項(xiàng)目開(kāi)發(fā) 教你實(shí)現(xiàn)Periscope點(diǎn)贊效果
- java創(chuàng)建線程的4種方式集合(最新整理)
- Android中Listview點(diǎn)贊功能的實(shí)現(xiàn)
- Android仿微信朋友圈點(diǎn)贊和評(píng)論功能
- Android自定義ViewGroup實(shí)現(xiàn)堆疊頭像的點(diǎn)贊Layout
- Android控件實(shí)現(xiàn)直播App點(diǎn)贊飄心動(dòng)畫(huà)
- Android SDK安裝及配置教程
相關(guān)文章
Android實(shí)現(xiàn)為L(zhǎng)istView同時(shí)設(shè)置點(diǎn)擊時(shí)的背景和點(diǎn)擊松手之后的背景
這篇文章主要介紹了Android實(shí)現(xiàn)為L(zhǎng)istView同時(shí)設(shè)置點(diǎn)擊時(shí)的背景和點(diǎn)擊松手之后的背景,以實(shí)例形式較為詳細(xì)的分析了界面元素與功能的實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02
Android識(shí)別預(yù)裝的第三方App方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Android如何識(shí)別預(yù)裝的第三方App的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
5步教你快速寫(xiě)一個(gè)android Router路由框架
本篇文章主要介紹了5步教你快速寫(xiě)一個(gè)Router路由框架(詳細(xì)步驟),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
Android 控件(button)對(duì)齊方法實(shí)現(xiàn)詳解
horizontal是讓所有的子元素按水平方向從左到右排列,vertical是讓所有的子元素按豎直方向從上到下排列,下面為大家介紹下控件(button)的對(duì)齊方法2013-06-06
Android界面一鍵變灰開(kāi)發(fā)深色適配模式編程示例
這篇文章主要為大家介紹了Android界面一鍵變灰開(kāi)發(fā)深色適配模式編程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Android編程之菜單的實(shí)現(xiàn)方法實(shí)例詳解
這篇文章主要介紹了Android編程之菜單的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了上下文菜單、選項(xiàng)菜單和子菜單的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-11-11
Android存儲(chǔ)權(quán)限兼容問(wèn)題解析
在?Android?開(kāi)發(fā)中,存儲(chǔ)權(quán)限是一個(gè)常見(jiàn)且重要的權(quán)限,不同版本的?Android?系統(tǒng)對(duì)于存儲(chǔ)權(quán)限的管理和處理方式存在差異,這就導(dǎo)致了開(kāi)發(fā)者在處理存儲(chǔ)權(quán)限時(shí)會(huì)遇到各種兼容問(wèn)題,本文將詳細(xì)介紹?Android?各版本存儲(chǔ)權(quán)限的變化,以及如何進(jìn)行兼容處理,并給出具體的代碼示例2025-02-02

