menu :android3.0以前常用的菜单
menu的三种实现方式:OptionsMenu,ContextMenu,PopupMenu
showAsAction属性共有五个值:ifRoom、never、always、withText、collapseActionView,可以混合使用。
ifRoom 会显示在Item中,但是如果已经有4个或者4个以上的Item时会隐藏在溢出列表中。当然个数并不仅仅局限于4个,依据屏幕的宽窄而定
never 永远不会显示。只会在溢出列表中显示,而且只显示标题,所以在定义item的时候,最好把标题都带上。
always 无论是否溢出,总会显示。
withText withText值示意Action bar要显示文本标题。Action bar会尽可能的显示这个标题,但是,如果图标有效并且受到Action bar空间的限制,文本标题有可能显示不全。
collapseActionView 声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。否则,这个操作视窗在默认的情况下是可见的,并且即便在用于不适用的时候,也要占据操作栏的有效空间。
一般要配合ifRoom一起使用才会有效果。
ifRoom 会显示在Item中,但是如果已经有4个或者4个以上的Item时会隐藏在溢出列表中。当然个数并不仅仅局限于4个,依据屏幕的宽窄而定
never 永远不会显示。只会在溢出列表中显示,而且只显示标题,所以在定义item的时候,最好把标题都带上。
always 无论是否溢出,总会显示。
withText withText值示意Action bar要显示文本标题。Action bar会尽可能的显示这个标题,但是,如果图标有效并且受到Action bar空间的限制,文本标题有可能显示不全。
collapseActionView 声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。否则,这个操作视窗在默认的情况下是可见的,并且即便在用于不适用的时候,也要占据操作栏的有效空间。
一般要配合ifRoom一起使用才会有效果。
在res资源文件夹下创建menu文件夹接着创建xml文件
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/item1" android:orderInCategory="100" android:title="选项1" app:showAsAction="never" /> <item android:id="@+id/item2" android:orderInCategory="100" android:title="选项2" app:showAsAction="never" /> <item android:id="@+id/item3" android:orderInCategory="100" android:title="选项3" app:showAsAction="never" /> </menu>
package cgg.com.sss; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast; public class MainActivity extends AppCompatActivity { /** * Menu 菜单:三种实现方式之一: * 重写onCreateOptionsMenu方法 * * onOptionsItemSelected方法做事件处理 */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // 利用菜单填充器将xml转成menu对象 getMenuInflater().inflate(R.menu.menu_item,menu); // 也可以动态添加item // menu.add(groundId,itemId,orderInCategory,title); menu.add(Menu.NONE,0x0011,101,"动态添加"); return true;// true表示让菜单显示出来 } /** * 菜单选项的点击事件处理的方法 */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()){ case R.id.item1: Toast.makeText(this, "item1", Toast.LENGTH_SHORT).show(); break; case R.id.item2: Toast.makeText(this, "item2", Toast.LENGTH_SHORT).show(); break; case R.id.item3: Toast.makeText(this, "item3", Toast.LENGTH_SHORT).show(); break; case 0x0011: Toast.makeText(this, "动态添加", Toast.LENGTH_SHORT).show(); break; } return super.onOptionsItemSelected(item); } }
运行效果
第二种方式
package cgg.com.sss; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends AppCompatActivity { /** * Menu 菜单:三种实现方式之一: * 重写onCreateContextMenu方法 * * onContextItemSelected方法做事件处理 */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button but = findViewById(R.id.test); // 注册上下文菜单绑定到某控件上(长按时触发) registerForContextMenu(but); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); // 利用菜单填充器将xml转成menu对象 getMenuInflater().inflate(R.menu.menu_item,menu); // 也可以动态添加item // menu.add(groundId,itemId,orderInCategory,title); menu.add(Menu.NONE,0x0011,101,"动态添加"); } /** * 菜单选项的点击事件处理的方法 */ @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()){ case R.id.item1: Toast.makeText(this, "item1", Toast.LENGTH_SHORT).show(); break; case R.id.item2: Toast.makeText(this, "item2", Toast.LENGTH_SHORT).show(); break; case R.id.item3: Toast.makeText(this, "item3", Toast.LENGTH_SHORT).show(); break; case 0x0011: Toast.makeText(this, "动态添加", Toast.LENGTH_SHORT).show(); break; } return super.onContextItemSelected(item); } }效果示例
最后一种 PopupMenu
package cgg.com.sss; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.PopupMenu; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // button的点击事件 public void showPopupMenu(View view) { PopupMenu popupMenu = new PopupMenu(this, view); getMenuInflater().inflate(R.menu.menu_item, popupMenu.getMenu()); popupMenu.show(); // PopupMenu的items事件处理 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.item1: Toast.makeText(MainActivity.this, "item1", Toast.LENGTH_SHORT).show(); break; case R.id.item2: Toast.makeText(MainActivity.this, "item2", Toast.LENGTH_SHORT).show(); break; case R.id.item3: Toast.makeText(MainActivity.this, "item3", Toast.LENGTH_SHORT).show(); break; } return false; } }); } }
运行效果