Android keyboard菜单实现

本文介绍了如何在Android中实现键盘菜单,通过定义XML布局文件创建一个GridView,并自定义一个继承自Dialog的菜单视图。为了达到良好的视觉效果,建议菜单内容的数量为GridView行数的倍数。

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


先上个效果图:


步骤大体如下:


1、定义xml,就是一个gridview

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gridview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:background="@color/gray_bg"
    android:clickable="false"
    android:descendantFocusability="blocksDescendants"
    android:horizontalSpacing="1dp"
    android:numColumns="6"
    android:verticalSpacing="1dp" >

</GridView>


2、自定义菜单view,继承自dialog

import android.app.Dialog;
import android.content.Context;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.GridView;

import com.hytech.jy.qiche.R;
import com.hytech.jy.qiche.adapter.KeyboardAdapter;
import com.hytech.jy.qiche.interfaces.KeyboardListener;

/**
 * 自定义dialog
 * @author ml
 *
 */
public class CustomDialog extends Dialog {

	public CustomDialog(Context context) {
		super(context);
	}

	public CustomDialog(Context context, int theme) {
		super(context, theme);
	}
	
	public static class Builder {
		private Context context;
		private CustomDialog dialog;
		private GridView mGridView;
		private KeyboardAdapter mAdapter;
		private KeyboardListener mKeyboardListener;
        private String []letters;

	    public Builder(Context context) {
		    this.context = context;
	    }

		public Builder setMessage(String []data) {
			this.letters = data;
			return this;
		}

		public Builder setKeyboardListener(KeyboardListener listener){
			this.mKeyboardListener = listener;
			return this;
		}

		public CustomDialog createDialog() {
			LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			// instantiate the dialog with the custom Theme
			dialog = new CustomDialog(context, R.style.myDialog);
			View view = inflater.inflate(R.layout.dialog_keyboards, null);
			mGridView = (GridView) view.findViewById(R.id.gridview);
			mAdapter = new KeyboardAdapter(context, letters, mKeyboardListener);
			mGridView.setAdapter(mAdapter);
			dialog.addContentView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
//			dialog.setContentView(view);
			//获得当前窗体
			Window window = dialog.getWindow();
			//重新设置
			WindowManager.LayoutParams lp = window.getAttributes();
			window.setGravity(Gravity.BOTTOM|Gravity.FILL_HORIZONTAL);
			lp.x = 0;
			lp.y = 0;
			window.setAttributes(lp);
			return dialog;
		}
	}

}

3、实现数据适配器

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.hytech.jy.qiche.R;
import com.hytech.jy.qiche.interfaces.KeyboardListener;

public class KeyboardAdapter extends BaseAdapter
{

	private Context mContext;
	private String[] contentStrings;
	private int id;

	private KeyboardListener mKeyboardListener;

	public KeyboardAdapter(Context context, String[] contents, KeyboardListener listener) {
		this.mContext = context;
		this.contentStrings = contents;
		this.mKeyboardListener = listener;
	}

	@Override
	public int getCount() {
		return contentStrings.length;
	}

	@Override
	public Object getItem(int position) {
		return contentStrings[position];
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		Holder mHolder = null;
		if (convertView == null) {
			mHolder = new Holder();
			convertView = LayoutInflater.from(mContext).inflate(
					R.layout.item_keyboards, null);
			mHolder.mTextView = (TextView) convertView.findViewById(R.id.text);
			convertView.setTag(mHolder);
		} else {
			mHolder = (Holder) convertView.getTag();
		}

		mHolder.mTextView.setText(contentStrings[position]);
		mHolder.mTextView.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				if (mKeyboardListener != null) {
					mKeyboardListener.getContent(contentStrings[position]);
				}
			}
		});
		return convertView;
	}

	public static class Holder {
		TextView mTextView;
	}

}

4、调用菜单

注:为了视觉效果,最好讲菜单内容填充完整,比如gridview有6行,菜单内容最好是6的倍数

        String[] letterStrings = getResources().getStringArray(R.array.letters);
        letterDialog = new CustomDialog.Builder(context).setMessage(letterStrings)
                .setKeyboardListener(new KeyboardListener() {
                    @Override
                    public void getContent(String info) {
                        if(!TextUtils.isEmpty(info)) {
                            letter = info;
                            letterSpinner.setText(letter);
                            letterDialog.dismiss();
                        }
                    }
                })
                .createDialog();
        letterDialog.show();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值