生活随笔
收集整理的這篇文章主要介紹了
android弹出窗口的实现(PopupWindow)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
android彈出窗口的實(shí)現(xiàn)(PopupWindow)??????????????
??????? ??????? ?? 最近看到新浪微博頂部欄的微博分組效果很炫,從網(wǎng)上查了一些資料明白原來(lái)是用PopupWindow實(shí)現(xiàn)的,今天自己也寫了一個(gè)例子實(shí)現(xiàn)了這種效果,希望對(duì)大家有幫助。
???????? PopupWindow就是彈出窗口的意思,類似windows下面的開始按鈕。PopupWindow可以實(shí)現(xiàn)浮層效果,而且可以自定義顯示位置,出現(xiàn)和退出時(shí)的動(dòng)畫.
??????????? 首先定義新浪微博的頂部欄,title_two_button.xml和main.xml
??????
[html] view plaincopyprint?
<?xml?version="1.0"?encoding="utf-8"?>??<FrameLayout?xmlns:android="http://schemas.android.com/apk/res/android"??????android:layout_width="fill_parent"??????android:layout_height="wrap_content"?>????????<TextView??????????android:id="@+id/tvtitle"??????????android:layout_width="fill_parent"??????????android:layout_height="45dip"??????????android:background="@drawable/search_bg"??????????android:gravity="center"??????????android:text="天堂沒有路"??????????android:textColor="@color/black"??????????android:textSize="25dip"?/>????????<Button??????????android:id="@+id/btn_title_left"??????????android:layout_width="50dip"??????????android:layout_height="35dip"??????????android:layout_gravity="center_vertical"??????????android:background="@drawable/title_button"??????????android:textColor="@color/white"?/>????????<Button??????????android:id="@+id/btn_title_right"??????????android:layout_width="50dip"??????????android:layout_height="35dip"??????????android:layout_gravity="right"??????????android:layout_marginRight="2dip"??????????android:layout_marginTop="4dip"??????????android:background="@drawable/title_button2"??????????android:textColor="@color/white"?/>????</FrameLayout>?? <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content" ><TextViewandroid:id="@+id/tvtitle"android:layout_width="fill_parent"android:layout_height="45dip"android:background="@drawable/search_bg"android:gravity="center"android:text="天堂沒有路"android:textColor="@color/black"android:textSize="25dip" /><Buttonandroid:id="@+id/btn_title_left"android:layout_width="50dip"android:layout_height="35dip"android:layout_gravity="center_vertical"android:background="@drawable/title_button"android:textColor="@color/white" /><Buttonandroid:id="@+id/btn_title_right"android:layout_width="50dip"android:layout_height="35dip"android:layout_gravity="right"android:layout_marginRight="2dip"android:layout_marginTop="4dip"android:background="@drawable/title_button2"android:textColor="@color/white" /></FrameLayout>
[html] view plaincopyprint?
<?xml?version="1.0"?encoding="utf-8"?>??<LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"??????android:layout_width="fill_parent"??????android:layout_height="fill_parent"??????android:background="@android:color/white"??????android:orientation="vertical"?>????????<include??????????android:id="@+id/top_title"??????????layout="@layout/title_two_button"?/>????</LinearLayout>?? <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@android:color/white"android:orientation="vertical" ><includeandroid:id="@+id/top_title"layout="@layout/title_two_button" /></LinearLayout> 主要是為了實(shí)現(xiàn)一個(gè)這樣的界面:
?
接下來(lái)定義彈出對(duì)話框的布局文件group_list.xml和group_item_view.xml
?
[html] view plaincopyprint?
<?xml?version="1.0"?encoding="utf-8"?>??<LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"??????android:layout_width="fill_parent"??????android:layout_height="fill_parent"??????android:background="@drawable/group_bg"??????android:orientation="vertical"???????>??????????<ImageView??????????android:id="@+id/iv_group_list_bg_divider"??????????android:layout_width="fill_parent"??????????android:layout_height="wrap_content"??????????android:background="@drawable/group_divider"???????????/>????????<ListView??????????android:id="@+id/lvGroup"??????????android:layout_width="fill_parent"??????????android:layout_height="fill_parent"??????????android:divider="@drawable/group_divider"????????????/>????</LinearLayout>?? <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@drawable/group_bg"android:orientation="vertical"><ImageViewandroid:id="@+id/iv_group_list_bg_divider"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@drawable/group_divider"/><ListViewandroid:id="@+id/lvGroup"android:layout_width="fill_parent"android:layout_height="fill_parent"android:divider="@drawable/group_divider"/></LinearLayout>
[html] view plaincopyprint?
<?xml?version="1.0"?encoding="utf-8"?>??<LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"??????android:layout_width="fill_parent"??????android:layout_height="@dimen/group_item_height"??????android:orientation="vertical"?>????????<TextView??????????android:id="@+id/groupItem"?????????android:textColor="#ffffff"?????????android:textSize="18dp"??????????android:layout_width="fill_parent"??????????android:layout_height="fill_parent"??????????android:gravity="center"?/>????</LinearLayout>?? <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="@dimen/group_item_height"android:orientation="vertical" ><TextViewandroid:id="@+id/groupItem"android:textColor="#ffffff"android:textSize="18dp"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center" /></LinearLayout>
?
?
自定義一個(gè)適配器:GroupAdapter
?
?
[html] view plaincopyprint?
import?java.util.List;????import?cn.com.karl.popwindow.R;??????import?android.content.Context;??import?android.graphics.Color;??import?android.view.LayoutInflater;??import?android.view.View;??import?android.view.ViewGroup;??import?android.widget.BaseAdapter;??import?android.widget.TextView;????public?class?GroupAdapter?extends?BaseAdapter?{????????private?Context?context;????????private?List<String>?list;????????public?GroupAdapter(Context?context,?List<String>?list)?{????????????this.context?=?context;??????????this.list?=?list;????????}????????@Override??????public?int?getCount()?{??????????return?list.size();??????}????????@Override??????public?Object?getItem(int?position)?{????????????return?list.get(position);??????}????????@Override??????public?long?getItemId(int?position)?{??????????return?position;??????}????????@Override??????public?View?getView(int?position,?View?convertView,?ViewGroup?viewGroup)?{??????????????????????ViewHolder?holder;??????????if?(convertView==null)?{??????????????convertView=LayoutInflater.from(context).inflate(R.layout.group_item_view,?null);??????????????holder=new?ViewHolder();????????????????????????????convertView.setTag(holder);????????????????????????????holder.groupItem=(TextView)?convertView.findViewById(R.id.groupItem);????????????????????????}??????????else{??????????????holder=(ViewHolder)?convertView.getTag();??????????}??????????holder.groupItem.setTextColor(Color.BLACK);??????????holder.groupItem.setText(list.get(position));????????????????????return?convertView;??????}????????static?class?ViewHolder?{??????????TextView?groupItem;??????}????}?? import java.util.List;import cn.com.karl.popwindow.R;import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;public class GroupAdapter extends BaseAdapter {private Context context;private List<String> list;public GroupAdapter(Context context, List<String> list) {this.context = context;this.list = list;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup viewGroup) {ViewHolder holder;if (convertView==null) {convertView=LayoutInflater.from(context).inflate(R.layout.group_item_view, null);holder=new ViewHolder();convertView.setTag(holder);holder.groupItem=(TextView) convertView.findViewById(R.id.groupItem);}else{holder=(ViewHolder) convertView.getTag();}holder.groupItem.setTextColor(Color.BLACK);holder.groupItem.setText(list.get(position));return convertView;}static class ViewHolder {TextView groupItem;}}
最后是我要實(shí)現(xiàn)彈出對(duì)話框的核心類PoupWindowDemoActivity
?
?
?
[html] view plaincopyprint?
import?java.util.ArrayList;??import?java.util.List;??????import?cn.com.karl.adapter.GroupAdapter;????import?android.app.Activity;??import?android.content.Context;??import?android.graphics.drawable.BitmapDrawable;??import?android.os.Bundle;??import?android.util.Log;??import?android.view.LayoutInflater;??import?android.view.View;??import?android.view.Window;??import?android.view.WindowManager;??import?android.widget.AdapterView;??import?android.widget.AdapterView.OnItemClickListener;??import?android.widget.ListView;??import?android.widget.PopupWindow;??import?android.widget.TextView;??import?android.widget.Toast;????public?class?PoupWindowDemoActivity?extends?Activity?{????????private?PopupWindow?popupWindow;????????private?ListView?lv_group;????????private?View?view;????????private?View?top_title;????????private?TextView?tvtitle;????????private?List<String>?groups;????????public?void?onCreate(Bundle?savedInstanceState)?{??????????super.onCreate(savedInstanceState);??????????this.requestWindowFeature(Window.FEATURE_NO_TITLE);??????????setContentView(R.layout.main);????????????top_title?=?this.findViewById(R.id.top_title);????????????tvtitle?=?(TextView)?top_title.findViewById(R.id.tvtitle);????????????tvtitle.setText("天堂沒有路");????????????tvtitle.setOnClickListener(new?View.OnClickListener()?{????????????????@Override??????????????public?void?onClick(View?v)?{??????????????????showWindow(v);??????????????}??????????});????????}??????????????private?void?showWindow(View?parent)?{????????????if?(popupWindow?==?null)?{??????????????LayoutInflater?layoutInflater?=?(LayoutInflater)?getSystemService(Context.LAYOUT_INFLATER_SERVICE);????????????????view?=?layoutInflater.inflate(R.layout.group_list,?null);????????????????lv_group?=?(ListView)?view.findViewById(R.id.lvGroup);??????????????//?加載數(shù)據(jù)??????????????groups?=?new?ArrayList<String>();??????????????groups.add("全部");??????????????groups.add("我的微博");??????????????groups.add("好友");??????????????groups.add("親人");??????????????groups.add("同學(xué)");??????????????groups.add("朋友");??????????????groups.add("陌生人");????????????????GroupAdapter?groupAdapter?=?new?GroupAdapter(this,?groups);??????????????lv_group.setAdapter(groupAdapter);??????????????//?創(chuàng)建一個(gè)PopuWidow對(duì)象??????????????popupWindow?=?new?PopupWindow(view,?300,?350);??????????}????????????//?使其聚集??????????popupWindow.setFocusable(true);??????????//?設(shè)置允許在外點(diǎn)擊消失??????????popupWindow.setOutsideTouchable(true);????????????//?這個(gè)是為了點(diǎn)擊“返回Back”也能使其消失,并且并不會(huì)影響你的背景??????????popupWindow.setBackgroundDrawable(new?BitmapDrawable());??????????WindowManager?windowManager?=?(WindowManager)?getSystemService(Context.WINDOW_SERVICE);??????????//?顯示的位置為:屏幕的寬度的一半-PopupWindow的高度的一半??????????int?xPos?=?windowManager.getDefaultDisplay().getWidth()?/?2??????????????????-?popupWindow.getWidth()?/?2;??????????Log.i("coder",?"xPos:"?+?xPos);????????????popupWindow.showAsDropDown(parent,?xPos,?0);????????????lv_group.setOnItemClickListener(new?OnItemClickListener()?{????????????????@Override??????????????public?void?onItemClick(AdapterView<?>?adapterView,?View?view,??????????????????????int?position,?long?id)?{????????????????????Toast.makeText(PoupWindowDemoActivity.this,??????????????????????????groups.get(position),?1000)??????????????????????????.show();????????????????????if?(popupWindow?!=?null)?{??????????????????????popupWindow.dismiss();??????????????????}??????????????}??????????});??????}??}?? import java.util.ArrayList;
import java.util.List;import cn.com.karl.adapter.GroupAdapter;import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;public class PoupWindowDemoActivity extends Activity {private PopupWindow popupWindow;private ListView lv_group;private View view;private View top_title;private TextView tvtitle;private List<String> groups;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.main);top_title = this.findViewById(R.id.top_title);tvtitle = (TextView) top_title.findViewById(R.id.tvtitle);tvtitle.setText("天堂沒有路");tvtitle.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {showWindow(v);}});}private void showWindow(View parent) {if (popupWindow == null) {LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);view = layoutInflater.inflate(R.layout.group_list, null);lv_group = (ListView) view.findViewById(R.id.lvGroup);// 加載數(shù)據(jù)groups = new ArrayList<String>();groups.add("全部");groups.add("我的微博");groups.add("好友");groups.add("親人");groups.add("同學(xué)");groups.add("朋友");groups.add("陌生人");GroupAdapter groupAdapter = new GroupAdapter(this, groups);lv_group.setAdapter(groupAdapter);// 創(chuàng)建一個(gè)PopuWidow對(duì)象popupWindow = new PopupWindow(view, 300, 350);}// 使其聚集popupWindow.setFocusable(true);// 設(shè)置允許在外點(diǎn)擊消失popupWindow.setOutsideTouchable(true);// 這個(gè)是為了點(diǎn)擊“返回Back”也能使其消失,并且并不會(huì)影響你的背景popupWindow.setBackgroundDrawable(new BitmapDrawable());WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);// 顯示的位置為:屏幕的寬度的一半-PopupWindow的高度的一半int xPos = windowManager.getDefaultDisplay().getWidth() / 2- popupWindow.getWidth() / 2;Log.i("coder", "xPos:" + xPos);popupWindow.showAsDropDown(parent, xPos, 0);lv_group.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view,int position, long id) {Toast.makeText(PoupWindowDemoActivity.this,groups.get(position), 1000).show();if (popupWindow != null) {popupWindow.dismiss();}}});}
}
這樣就完成了一個(gè)彈出對(duì)話框的效果,下面來(lái)看一下吧!
?
再看一張新浪微博的彈出對(duì)話框效果:
已經(jīng)完成,我們可以把這項(xiàng)功能加入自己的做的新浪微博里,為自己的應(yīng)用增添點(diǎn)特色色彩吧!
轉(zhuǎn)載于:https://www.cnblogs.com/leifengcomrade/p/3952404.html
總結(jié)
以上是生活随笔為你收集整理的android弹出窗口的实现(PopupWindow)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。