Android Popupwindow the way to implement pop-up menus _android

Source: Internet
Author: User
Tags stub
When you use Uc-webbrowser, you will find that its pop-up menu is different from the one that comes with the system. It implements more menu options for display and columns. In fact, it is Popupwindow or Alertdialog dialog box, add two GridView control inside, one is menu title bar, one is menu option. The switch of menu options view can be easily implemented through the transformation of adapters.
Click to download the example:
One, the operation screenshot:



Second, to achieve the main points:
(1) Screen system pop-up menu:
1, first create at least one of the system's menu options

Copy Code code as follows:

@Override
public boolean Oncreateoptionsmenu (Menu menu) {

Menu.add ("menu");
return Super.oncreateoptionsmenu (menu);
}

2, in the Onmenuopened method to display their own menu view, and return false.
Copy Code code as follows:

@Override
public boolean onmenuopened (int featureid, menu menu) {
Mymenu.showatlocation (Findviewbyid (r.id.layout), Gravity.bottom, 0,0);

return false; true--display System with its own menu; false--not displayed.
}

(2) Click on the menu bar, switch menu view, just reset the current adapter object can be.
Copy Code code as follows:

Gv_body.setadapter (Bodyadapter[arg2]); Change Options View

(3) inherit Popupwindow, rewrite a Class implementation pop-up dialog box, mainly for better and easier implementation of pop-up menu style and event response, and so on.
Copy Code code as follows:

public class Mydefinedmenu extends Popupwindow {... }

Three, the specific code is as follows:
(1) Layout:
Copy Code code as follows:

<?xml version= "1.0" encoding= "Utf-8"?>
<linearlayout xmlns:android= "Http://schemas.android.com/apk/res/android"
Android:id= "@+id/layout"
android:orientation= "Vertical"
Android:layout_width= "Fill_parent"
android:layout_height= "Fill_parent"
>
</LinearLayout>

(2) program code
1. Main class: MyMenu
Copy Code code as follows:

Package com.myandroid.test;
Import java.util.ArrayList;
Import java.util.List;
Import android.app.Activity;
Import Android.os.Bundle;
Import android.view.Gravity;
Import Android.view.Menu;
Import Android.view.View;
Import Android.widget.AdapterView;
Import Android.widget.AdapterView.OnItemClickListener;
Import Android.widget.Toast;
public class MyMenu extends activity {
Private list<string> titles; Title bar
Private list<list<string>> item_names; Option name
Private list<list<integer>> item_images; Option icon
Private Mydefinedmenu MyMenu; pop-up menu


/** called the activity is a. */
@Override
public void OnCreate (Bundle savedinstancestate) {
Super.oncreate (savedinstancestate);
Setcontentview (R.layout.main);

pop-up menu title bar
Titles = Additems (new string[]{"Menu One", "menu Two", "menu Three"});
Option icon
Item_images = new arraylist<list<integer>> ();
Item_images.add (Additems) (New Integer[]{r.drawable.bag,
R.drawable.bluetooth, R.drawable.earth, r.drawable.email}));
Item_images.add (Additems) (New Integer[]{r.drawable.map,
R.drawable.news, R.drawable.reader, R.drawable.sound, r.drawable.tape});
Item_images.add (Additems) (New Integer[]{r.drawable.telephone,
R.drawable.bluetooth, R.drawable.earth, r.drawable.email}));
Option name
Item_names = new arraylist<list<string>> ();
Item_names.add (Additems (new string[]{"shopping", "Bluetooth", "browser", "Mail"});
Item_names.add (Additems (New string[]{"map", "News", "reader", "Speaker", "recording"});
Item_names.add (Additems (New string[]{"Phone", "Bluetooth", "Reader", "Mailbox"});
Create a pop-up menu object
MyMenu = new Mydefinedmenu (this, titles, Item_names,
Item_images, New Itemclickevent ());

}

/**
* Convert to List<string>
* @param values
* @return
*/
Private list<string> Additems (string[] values) {

list<string> list = new arraylist<string> ();
for (String var:values) {
List.add (VAR);
}

return list;
}

/**
* Convert to List<integer>
* @param values
* @return
*/
Private list<integer> Additems (integer[] values) {

list<integer> list = new arraylist<integer> ();
for (Integer var:values) {
List.add (VAR);
}

return list;
}

@Override
public boolean Oncreateoptionsmenu (Menu menu) {

Menu.add ("menu");
return Super.oncreateoptionsmenu (menu);
}
@Override
public boolean onmenuopened (int featureid, menu menu) {
Mymenu.showatlocation (Findviewbyid (r.id.layout), Gravity.bottom, 0,0);

return false; true--display System with its own menu; false--not displayed.
}

/**
* Menu Options Click event
* @author Kobi
*
*/
Class Itemclickevent implements Onitemclicklistener {
@Override
public void Onitemclick (adapterview<?> arg0, View arg1, int arg2,
Long Arg3) {
Shows which menu is clicked and which option.
Toast.maketext (Mymenu.this, "menu:" +
Titles.get (Mymenu.gettitleindex ()) +
"Item:" + item_names.get (Mymenu.gettitleindex ()). Get (ARG2),
Toast.length_short). Show ();
Mymenu.dismiss (); Menu disappears
}

}
}

2, pop-up menu categories: Mydefinedmenu,
Copy Code code as follows:

Package com.myandroid.test;
Import java.util.List;
Import com.myandroid.test.MyMenu.ItemClickEvent;
Import Android.content.Context;
Import Android.graphics.Color;
Import Android.util.Log;
Import Android.view.View;
Import Android.view.ViewGroup.LayoutParams;
Import Android.widget.AdapterView;
Import Android.widget.AdapterView.OnItemClickListener;
Import Android.widget.GridView;
Import Android.widget.LinearLayout;
Import Android.widget.PopupWindow;
public class Mydefinedmenu extends Popupwindow {

Private LinearLayout layout; The overall layout
Private GridView Gv_title; Menu bar
Private GridView gv_body; Options View
Private bodyadatper[] Bodyadapter; Option adapters
Private Titleadatper Titleadapter; Title Adapter
private context; Context
private int titleindex; Menu Serial Number



Public Mydefinedmenu (context, list<string> titles,
List<list<string>> Item_names, List<list<integer>> item_images,
Itemclickevent itemclickevent) {

Super (context);
This.context = context;

Layout framework
Layout = new LinearLayout (context);
Layout.setorientation (linearlayout.vertical);
Layout.setlayoutparams (New Layoutparams (
Layoutparams.fill_parent, layoutparams.wrap_content));

Menu bar
Titleindex = 0;
Gv_title = new GridView (context);
Titleadapter = new Titleadatper (context, titles);
Gv_title.setadapter (Titleadapter);
Gv_title.setlayoutparams (New Layoutparams (
Layoutparams.fill_parent, layoutparams.wrap_content));
Gv_title.setnumcolumns (Titles.size ()); Number of Menus
Gv_title.setbackgroundcolor (Color.White);

Options View
Bodyadapter = new Bodyadatper[item_names.size ()]; Individual view Adapters
for (int i = 0; i < item_names.size (); i++) {
Bodyadapter[i] = new Bodyadatper (context, Item_names.get (i), item_images.get (i));
}
Gv_body = new GridView (context);
Gv_body.setnumcolumns (4); Display 4 options per line
Gv_body.setbackgroundcolor (color.transparent);
Gv_body.setadapter (Bodyadapter[0]); Setting up Adapters

menu item Toggle
Gv_title.setonitemclicklistener (New Onitemclicklistener () {
@Override
public void Onitemclick (adapterview<?> arg0, View arg1, int arg2,
Long Arg3) {
Titleindex = arg2; Record the currently selected menu item ordinal
Titleadapter.setfocus (ARG2);
Gv_body.setadapter (Bodyadapter[arg2]); Change Options View
}
});

Set Options Click events
Gv_body.setonitemclicklistener (itemclickevent);

Add title bar and options
Layout.addview (Gv_title);
Layout.addview (Gv_body);

Add a menu View
This.setcontentview (layout);
This.setwidth (layoutparams.fill_parent);
This.setheight (layoutparams.wrap_content);
This.setfocusable (TRUE);//Menu gets focus if the control event in the Focus menu does not get a response

}

/**
* Get the currently selected menu item
* @return menu Item serial number
*/
public int Gettitleindex () {

return titleindex;
}

}

3. Menu Bar Adapter: Titleadatper
Copy Code code as follows:

Package com.myandroid.test;
Import java.util.List;
Import Android.content.Context;
Import Android.graphics.Color;
Import android.view.Gravity;
Import Android.view.View;
Import Android.view.ViewGroup;
Import Android.view.ViewGroup.LayoutParams;
Import Android.widget.BaseAdapter;
Import Android.widget.GridView;
Import Android.widget.TextView;
public class Titleadatper extends Baseadapter {
Private list<string> titles;
private context;
Private final textview[] tv_titels;


Public Titleadatper (context, list<string> titles) {
This.context = context;
This.titles = titles;
Tv_titels = new Textview[titles.size ()];
}
@Override
public int GetCount () {
TODO auto-generated Method Stub
return Titles.size ();
}
@Override
Public Object getitem (int position) {
TODO auto-generated Method Stub
return position;
}
@Override
public long getitemid (int position) {
TODO auto-generated Method Stub
return position;
}

/**
* When selected, change the menu color.
* @param position
*/
public void SetFocus (int position) {

for (int i = 0; i < titles.size (); i++) {

Tv_titels[i].setbackgroundcolor (Color.White);
}

Tv_titels[position].setbackgroundcolor (Color.Blue);

}
@Override
Public View GetView (int position, View Convertview, ViewGroup parent) {
Menu Bar Text Items
Tv_titels[position] = new TextView (context);
Tv_titels[position].setgravity (Gravity.center);
Tv_titels[position].settext (Titles.get (position));
Tv_titels[position].settextsize (18);
Tv_titels[position].setlayoutparams (New Gridview.layoutparams (
Layoutparams.fill_parent, layoutparams.wrap_content));

return tv_titels[position];
}
}

4. Menu Single View adapter: Bodyadatper
Copy Code code as follows:

Package com.myandroid.test;
Import java.util.List;
Import Android.content.Context;
Import android.view.Gravity;
Import Android.view.View;
Import Android.view.ViewGroup;
Import Android.view.ViewGroup.LayoutParams;
Import Android.widget.BaseAdapter;
Import Android.widget.GridView;
Import Android.widget.ImageView;
Import Android.widget.LinearLayout;
Import Android.widget.TextView;
public class Bodyadatper extends Baseadapter {

Private list<string> item_names;
Private list<integer> item_images;
private context;


Public Bodyadatper, List<string> Item_names,
List<integer> item_images) {
This.context = context;
This.item_names = Item_names;
This.item_images = item_images;
}
@Override
public int GetCount () {
TODO auto-generated Method Stub
return Item_images.size ();
}
@Override
Public Object getitem (int position) {
TODO auto-generated Method Stub
return position;
}
@Override
public long getitemid (int position) {
TODO auto-generated Method Stub
return position;
}

@Override
Public View GetView (int position, View Convertview, ViewGroup parent) {
General layout
LinearLayout layout = new LinearLayout (context);
Layout.setorientation (linearlayout.vertical);
Layout.setgravity (Gravity.center);
Option name
TextView Tv_item = new TextView (context);
Tv_item.setgravity (Gravity.center);
Tv_item.setlayoutparams (New Gridview.layoutparams (
Layoutparams.fill_parent, layoutparams.wrap_content));
Tv_item.settext (Item_names.get (position));
Options Chart
ImageView Img_item = new ImageView (context);
Img_item.setlayoutparams (New Layoutparams (50, 50));
Img_item.setimageresource (Item_images.get (position));
Add option icon and name
Layout.addview (Img_item);
Layout.addview (Tv_item);

return layout;
}
}

Here is implemented with Popupwindow, of course, you can use Alertdialog or other custom dialog boxes, and so on, you can also rewrite the menu, you can also use the tab to achieve. There are many ways to implement it, but the principle is the same, for example, with two GridView, one as a menu bar and one as a menu item view.

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.