Popwindow封装

本文介绍了一个实现智能选择语言功能的弹出菜单,包括菜单布局、样式设置、菜单项添加、点击事件处理及窗口展示逻辑。通过定义一个自定义适配器和上下文监听器,实现在应用中灵活地选择不同语言的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package cn.uc.uctranslateplugin.widget;


import java.util.ArrayList;


import cn.uc.uctranslateplugin.R;
import cn.uc.uctranslateplugin.R.dimen;
import cn.uc.uctranslateplugin.R.id;
import cn.uc.uctranslateplugin.R.layout;


import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;


public class PopMenu {
	private ArrayList<String> itemList;
	private Context context;
	private PopupWindow popupWindow;
	private ListView listView;


	@SuppressLint("NewApi")
	@SuppressWarnings("deprecation")
	public PopMenu(Context context) {


		this.context = context;


		itemList = new ArrayList<String>(5);


		View view = LayoutInflater.from(context).inflate(
				R.layout.layout_popmenu, null);


		listView = (ListView) view.findViewById(R.id.listView);
		listView.setAdapter(new PopAdapter());
		listView.setFocusableInTouchMode(true);
		listView.setFocusable(true);


		if (getApiLev() > 8) {
			listView.setOverScrollMode(View.OVER_SCROLL_NEVER);
		}
		popupWindow = new PopupWindow(view, context.getResources()
				.getDimensionPixelSize(R.dimen.popmenu_width), context
				.getResources().getDimensionPixelSize(R.dimen.popmenu_heigh));
		popupWindow = new PopupWindow(view, context.getResources()
				.getDimensionPixelSize(R.dimen.popmenu_width),
				LayoutParams.WRAP_CONTENT);


		popupWindow.setBackgroundDrawable(new BitmapDrawable(context
				.getResources()));
	}


	public void setOnItemClickListener(OnItemClickListener listener) {
		listView.setOnItemClickListener(listener);
	}


	public void addItems(String[] items) {
		for (String s : items)
			itemList.add(s);
	}


	public void addItem(String item) {
		itemList.add(item);
	}


	/**
	 * 获取父控件的位置y-window的高度 = 应该显示的y坐标. x这里设置为center 不刻意指定坐标 控件坐标永远是 左上角坐标!
	 * 
	 * @param parent
	 */
	public void showUp(View parent) {


		int[] location = new int[2];


		parent.getLocationOnScreen(location);
		popupWindow.setAnimationStyle(R.style.AnimationPopup);
		popupWindow.showAtLocation(parent, Gravity.CENTER_HORIZONTAL
				| Gravity.TOP, 0, location[1] - popupWindow.getHeight() + 20);


		popupWindow.setFocusable(true);
		popupWindow.setOutsideTouchable(true);


		popupWindow.update();
	}


	public void showAsDropDown(View parent) {


		popupWindow.showAsDropDown(parent, context.getResources()
				.getDimensionPixelSize(R.dimen.popmenu_xoff),


		context.getResources().getDimensionPixelSize(R.dimen.popmenu_yoff));


		popupWindow.setFocusable(true);
		popupWindow.setOutsideTouchable(true);


		popupWindow.update();
	}


	public void dismiss() {
		popupWindow.dismiss();
	}


	private final class PopAdapter extends BaseAdapter {


		@Override
		public int getCount() {


			return itemList.size();
		}


		@Override
		public Object getItem(int position) {


			return itemList.get(position);
		}


		@Override
		public long getItemId(int position) {


			return position;
		}


		@Override
		public View getView(int position, View convertView, ViewGroup parent) {


			ViewHolder holder;
			if (convertView == null) {
				convertView = LayoutInflater.from(context).inflate(
						R.layout.item_pomenu, null);
				holder = new ViewHolder();


				convertView.setTag(holder);


				holder.groupItem = (TextView) convertView
						.findViewById(R.id.textView);


			} else {
				holder = (ViewHolder) convertView.getTag();
			}


			holder.groupItem.setText(itemList.get(position));


			return convertView;
		}


		private final class ViewHolder {
			TextView groupItem;
		}
	}


	public static int getApiLev() {
		int version = 0;
		version = android.os.Build.VERSION.SDK_INT;
		Log.e("apilev", version + "'");
		return version;
	}
}


	public void chooseLanguage(View view) {

		gpopMenu.showAsDropDown(view);

	}

	private void initPopMenu() {
		gpopMenu = new PopMenu(gcontext);
		menus = new String[] { "English", "AR", "ES", "FR", "FA", "PT", "VI",
				"RU", "ID", "ZH-TW" };
		gpopMenu.addItems(menus);
		gpopMenu.setOnItemClickListener(popmenuItemClickListener);
	}

	private OnItemClickListener popmenuItemClickListener = new OnItemClickListener() {

		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			languagetype = position;
			DataStoreUtil.putInt(gcontext, "LANGUAGE", languagetype);
			btn_chooselanguage.setText(menus[position]);

			startTranslate(translatemethod);
			gpopMenu.dismiss();

		}
	};



动画地址

http://blog.youkuaiyun.com/sfshine/article/details/8876891
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值