android中每个页面基本上都有顶部导航,android中顶部导航有actionbar,但actionbar一方面要向下兼容问题,另一方面很多时候修改样式比较繁琐,自定义的actionbar也需要写很多东西。对于顶部导航,有两个比较可行的方式:
- 可以自己封装一套actionbar,导入v7包,然后在style中配置相应的属性。
- 自己封装一个pop做为导航效果。
下面是用pop封装的一个导航
效果图:
在需要的时候要需要new一下菜单,调用点击事件:
public class MainActivity extends Activity implements OnClickListener {
private TextView tv_title;
private ImageView iv_back;
private ImageView iv_list;
PopListMenu listMenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
tv_title = (TextView) findViewById(R.id.tv_title);
iv_back = (ImageView) findViewById(R.id.iv_back);
iv_list = (ImageView) findViewById(R.id.iv_list);
iv_back.setOnClickListener(this);
iv_list.setOnClickListener(this);
// 在这可设置返回,菜单图片样式和标题;
tv_title.setText("标题");
// 2指的是组数,在这设置了两组;如果不需要的话写成1组
listMenu = new PopListMenu(this, 1);
listMenu.addItems(new String[] { "菜单1", "菜单2", "菜单3", "菜单4" });
//也可设置listMenu的宽度;
// listMenu.setWidth(200);
listMenu.setOnItemClickListener(new Sys.OnItemClickListener() {
@Override
public void run(AdapterView<?> arg0, View arg1, int index, long arg3)
throws Exception {
// switch case 来判断下标;
Toast.makeText(MainActivity.this, "点击" + index, 0).show();
}
});
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.iv_back:
Toast.makeText(this, "返回", 0).show();
break;
case R.id.iv_list:
listMenu.showAsDropDown(v);
break;
}
}
}
下面是对pop的封装
public class PopListMenu {
private ArrayList<String> itemList;
private Context context;
private PopupWindow popupWindow;
private ListView listView;
/**
* 选中项索引列表
*/
ArrayList<Integer> indexList = new ArrayList<Integer>();
/**
* 每组选项在itemList的起始位置
*/
ArrayList<Integer> itemStartList = new ArrayList<Integer>();
// private OnItemClickListener listener;
public PopListMenu(Context context) {
this(context, 1);
}
public boolean showDot = true;
/**
* @param context
* @param count
* 有几组选项
*/
public PopListMenu(Context context, int count) {
// TODO Auto-generated constructor stub
for (int i = 0; i < count; i++) {
indexList.add(0);
itemStartList.add(0);
}
this.context = context;
itemList = new ArrayList<String>(2);
View view = LayoutInflater.from(context)
.inflate(R.layout.popmenu, null);
// 设置 listview
listView = (ListView) view.findViewById(R.id.listView);
listView.setAdapter(new PopAdapter());
listView.setFocusableInTouchMode(true);
listView.setFocusable(true);
popupWindow = new PopupWindow(view, LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
// 点击返回,popupWindow消失;
popupWindow.setBackgroundDrawable(new BitmapDrawable());
}
public void setWidth(int width) {
LayoutParams para = listView.getLayoutParams();
para.width = Sys.dp2px(width);
listView.setLayoutParams(para);
}
// 设置菜单项点击监听器
public void setOnItemClickListener(final OnItemClickListener listener) {
// this.listener = listener;
if (listView == null)
return;
listView.setOnItemClickListener(new Sys.OnItemClickListener() {
@Override
public void run(AdapterView<?> parent, View view, int position,
long id) throws Exception {
// TODO Auto-generated method stub
if (itemStartList.size() > 1) {
// 当组数大于1时计算组内偏移位置,如果菜单为二个组时,则要考虑的情况;
for (int i = 0; i < itemStartList.size(); i++) {
int startI = itemStartList.get(i);
int endI = itemStartList.size() > i + 1 ? itemStartList
.get(i + 1) : itemList.size();
if (position >= startI && position < endI) {
setSelIndex(i, position - startI);
break;
}
}
} else
setSelIndex(position);
dismiss();
listener.onItemClick(parent, view, position, id);
}
});
}
/**
* 批量添加菜单项,默认添加到第0组里
*
* @param items
*/
public void addItems(String[] items) {
for (String s : items)
itemList.add(s);
if (itemStartList.size() > 1)
itemStartList.set(1, itemList.size());
}
/**
* @param items
* @param index
* 第几组索引
*/
public void addItems(String[] items, int index) {
itemStartList.set(index, itemList.size());
for (String s : items)
itemList.add(s);
if (itemStartList.size() > index + 1)
itemStartList.set(index + 1, itemList.size());
}
// 单个添加菜单项
public void addItem(String item) {
itemList.add(item);
}
// 下拉式 弹出 pop菜单 parent 右下角
public void showAsDropDown(View parent) {
popupWindow.showAsDropDown(parent, Sys.dp2px(10),
// 保证尺寸是根据屏幕像素密度来的
Sys.dp2px(0));
// 使其聚集
popupWindow.setFocusable(true);
// 设置允许在外点击消失
popupWindow.setOutsideTouchable(true);
// 刷新状态
popupWindow.update();
}
// 隐藏菜单
public void dismiss() {
popupWindow.dismiss();
}
public int getSelIndex() {
return indexList.get(0);
}
/**
* @param index
* 组索引
* @return
*/
public int getSelIndex(int index) {
return indexList.get(index);
}
/**
* 向第0组赋值选中项
*
* @param selIndex
*/
public void setSelIndex(int selIndex) {
indexList.set(0, selIndex);
}
/**
* @param index
* 组索引
* @param selIndex
* 对应组的选中值
*/
public void setSelIndex(int index, int selIndex) {
indexList.set(index, selIndex);
}
// 适配器
private final class PopAdapter extends BaseAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
return itemList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return itemList.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(
R.layout.pomenu_item, null);
holder = new ViewHolder();
convertView.setTag(holder);
holder.groupItem = (TextView) convertView
.findViewById(R.id.textView);
holder.hint = (ImageView) convertView
.findViewById(R.id.ib_hint);
holder.view_item_line = convertView
.findViewById(R.id.view_item_line);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.groupItem.setText(itemList.get(position));
if (itemStartList.size() > 1) {
for (int i = 0; i < itemStartList.size(); i++) {
int startI = itemStartList.get(i);
int endI = itemStartList.size() > i + 1 ? itemStartList
.get(i + 1) : itemList.size();
if (position >= startI && position < endI) {
// 考虑到如果有两组的话,,组与组之间也有分组线,组分隔线的显示,在xml中未定义。
// 如果没有组组的情况,则可忽略此处代码。
if (position > 0 && position == startI)
holder.view_item_line.setVisibility(View.VISIBLE);
else
holder.view_item_line.setVisibility(View.GONE);
if (position - startI == getSelIndex(i))
holder.hint.setVisibility(View.VISIBLE);
else
holder.hint.setVisibility(View.INVISIBLE);
break;
}
}
} else {
holder.view_item_line.setVisibility(View.GONE);
if (position == getSelIndex())
holder.hint.setVisibility(View.VISIBLE);
else
holder.hint.setVisibility(View.INVISIBLE);
}
holder.view_item_line.setVisibility(View.VISIBLE);
if (!showDot)
holder.hint.setVisibility(View.GONE);
return convertView;
}
private final class ViewHolder {
//文本显示
TextView groupItem;
// 设置选中项的提示图片;
ImageView hint;
//下划线;可以去掉,或者设置其他颜色;
View view_item_line;
}
}
}
demo下载地址:http://download.csdn.net/detail/androidxiaogang/9248313