先上个效果图:
步骤大体如下:
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();