Android Studio 菜单之ConTextMenu
ContextMenu菜单就是长按某一个按钮,就会在屏幕的中间弹出ContextMenu
创建Menu就跟创建OptionMenu方法是一样的,有不懂的小伙伴可以去看我上一篇博客
创建好了后就先编写contextmenu.xml的代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/del"
android:title="删除" />
<item
android:id="@+id/add"
android:title="增加" />
<item
android:id="@+id/more"
android:title="更多" />
</menu>
这里我只写了三个,有更多需要的可以继续添加
接下来就是注册一个按钮
package com.example.myapplication;
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 {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_main);
//1.注册ctm_btn
registerForContextMenu (findViewById (R.id.btn_ctm));
}
//2.创建ContextMenu
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater ().inflate (R.menu.contextmenu,menu);
}
//菜单项绑定点击事件
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId ()){ //获取Id
case R.id.add:
Toast.makeText (this,"增加",Toast.LENGTH_LONG).show ();
break;
case R.id.del:
Toast.makeText (this,"删除",Toast.LENGTH_LONG).show ();
break;
case R.id.more:
Toast.makeText (this,"More",Toast.LENGTH_LONG).show ();
break;
}
return super.onOptionsItemSelected (item);
}
}
现在activity_main.xml下创建一个按钮,这里我的按钮的名字是btn_ctm,然后通过registerForContextMenu 方法来注册按钮,则测好了之后就通过onCreateContextMenu来创建ContextMenu,之后就是绑定事件,虽然这个ContextMenu的创建方法和绑定事件的方法跟OptionMenu的几乎一样,但是效果缺差很多哦,编写好了就可以运行啦!!!
还有一种模式,就是当你长按某个按钮之后,菜单栏不是出现在屏幕的正中间,二十出现在顶部,并且会覆盖当前显示的标题框,效果如图所示
代码只需要修改ActivityMain.Java的即可实现
package com.example.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.ActionMode;
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 {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_main);
//为按钮设置上下文操作模式
//1.实现ActionMode CallBack
//2.在view的长按事件中去启动上下文操作模式
findViewById (R.id.btn_ctm).setOnLongClickListener (new View.OnLongClickListener(){
@Override
public boolean onLongClick(View v) {
startActionMode (cb); //启动
return false;
}
});
// registerForContextMenu (findViewById (R.id.btn_ctm));
}
ActionMode.Callback cb = new ActionMode.Callback () {
//创建方法,启动时调用
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
Log.e ("TAG","启动");
getMenuInflater ().inflate (R.menu.contextmenu,menu);
return true;
}
//在方法创建好之后进行调用
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
Log.e ("TAG","准备");
return true;
}
//绑定点击事件
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId ()){ //获取Id
case R.id.add:
Toast.makeText (MainActivity.this,"增加",Toast.LENGTH_LONG).show ();
break;
case R.id.del:
Toast.makeText (MainActivity.this,"删除",Toast.LENGTH_LONG).show ();
break;
case R.id.more:
Toast.makeText (MainActivity.this,"More",Toast.LENGTH_LONG).show ();
break;
}
return true;
}
//结束时被调用
@Override
public void onDestroyActionMode(ActionMode mode) {
Log.e ("TAG","结束");
}
};
ActionMode.Callback一共有四个回调方法,启动,准备,执行,结束,这里我打印了Log,当你长按按钮启动至结束时,会打印如图所示的日志;