Produção da barra de menu do Android Studio
Preparação de arquivo XML para barra de menu estática
1. Pronto para fazer o layout do arquivo XML da página de exibição da página inicial
O arquivo de layout é adequado para três tipos de barras de menu.
Aqui está uma explicação dos tipos de barras de menu: menu de opções (também conhecido como tecla de menu de três pontos), menu de contexto (menu de toque longo), menu pop-up (menu de clique)
código mostrado abaixo:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="山有木兮木有枝,心悦君兮君不知"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.242" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选项一"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.69"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:layout_constraintVertical_bias="0.254" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选项二"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.309"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:layout_constraintVertical_bias="0.252" />
</androidx.constraintlayout.widget.ConstraintLayout>
2. Prepare o arquivo de layout da barra de menu
1. Primeiro crie uma pasta XML para armazenar a barra de menu, olhe para as etapas de criação na figura abaixo, primeiro encontre res-> Novo-> Diretório
2. Preencha o nome da pasta, é melhor saber o nome. (Cardápio)
3. Crie um arquivo de recurso de menu, menu -> Novo -> Arquivo de recurso de menu
4. Preencha o nome do arquivo de recurso recém-criado
Aqui, criei dois arquivos de recursos de menu:
código mostrado abaixo:
menu1
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<item android:id="@+id/one1"
android:title="菜单一"></item>
<item android:id="@+id/one2"
android:title="菜单二"></item>
<item android:id="@+id/one3"
android:title="菜单三"></item>
<item android:id="@+id/one4"
android:title="菜单四"></item>
</menu>
menu2
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width = "match_parent"
android:layout_height = "match_parent">
<item android:id="@+id/bu1"
android:title="选项一"></item>
<item android:id="@+id/bu2"
android:title="选项一"></item>
<item android:id="@+id/bu3"
android:title="选项一"></item>
</menu>
Quando estiver pronto, comece a escrever o código Java abaixo.
Menu de opções
1. Defina as variáveis globais necessárias
2. Obtenha os recursos das variáveis globais definidas acima na função onCreate (Bundle savedInstanceState)
As duas etapas acima são obrigatórias e as etapas a seguir não serão introduzidas.
3. Reescreva o método onCreateOptionsMenu (menu Menu) da Activity, chame o objeto Menu neste método para adicionar um menu ou submenu.
4. O aplicativo precisa responder ao evento de clique do item de menu. Você pode substituir o método onOptionsItemSelected (MenuItem item) de Activity, chamar item.getItemId () para obter o ID do item de menu clicado e dar respostas diferentes
código java:
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
//定义按钮的全局变量
private Button button;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 绑定按钮的资源(利用id找到xml文件中的按钮)
button = findViewById(R.id.button);
textView = findViewById(R.id.textView);
}
@Override//重写获取菜单项的方法
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater=getMenuInflater();//获取菜单Inflater,MenuInflater加载menu布局文件
inflater.inflate(R.menu.menu1,menu);//通过inflate获取菜单资源
return true;
}
@Override//菜单项被点击时的逻辑处理
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.one1:
Toast.makeText(MainActivity.this,"我是一",Toast.LENGTH_LONG).show();
break;
case R.id.one2:
Toast.makeText(MainActivity.this,"我是二",Toast.LENGTH_LONG).show();
break;
case R.id.one3:
Toast.makeText(MainActivity.this,"我是三",Toast.LENGTH_LONG).show();
break;
case R.id.one4:
Toast.makeText(MainActivity.this,"我是四",Toast.LENGTH_LONG).show();
break;
default:
return true;
}
return true;
}
}
As renderizações são as seguintes:
Menu contextual
1. Reescreva o método onCreateContextMenu (menu ContextMenu, Exibir v, ContextMenu.ContextMenuInfo menuInfo) da Activity.
2. Chame o método registerForContextMenu (textView) de Activity para registrar o menu de contexto para o componente View
2. Reescreva onContextItemSelected (item MenuItem) da Activity em resposta à operação de seleção do item de menu, chame item.getItemId () para obter o ID do item de menu clicado e dê diferentes respostas
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
//定义按钮的全局变量
private Button button;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 绑定按钮的资源(利用id找到xml文件中的按钮)
button = findViewById(R.id.button);
textView = findViewById(R.id.textView);
//为组件注册上下文菜单
registerForContextMenu(textView);
}
//重写Activity的onCreateContextMenu()
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo){
switch (v.getId()){
case R.id.textView:
menu.setHeaderTitle("分享到,,,");
menu.add(0,200,0,"qq空间");
menu.add(0,201,0,"朋友圈");
SubMenu submenu = menu.addSubMenu(0,200,0,"微博");
submenu.add(0,202,0,"新浪");
submenu.add(0,203,0,"新浪");
submenu.add(0,204,0,"新浪");
default:
break;
}
super.onCreateContextMenu(menu,v,menuInfo);
}
//重写Activity的onContextItemSelected()
public boolean onContextItemSelected(MenuItem item){
switch (item.getItemId()){
case 200:
Toast.makeText(MainActivity.this,"你选了一",Toast.LENGTH_LONG).show();
break;
case 201:
Toast.makeText(MainActivity.this,"你选了二",Toast.LENGTH_LONG).show();
break;
case 203:
Toast.makeText(MainActivity.this,"你选了三",Toast.LENGTH_LONG).show();
break;
case 204:
Toast.makeText(MainActivity.this,"你选了四",Toast.LENGTH_LONG).show();
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
}
A imagem do efeito é a seguinte: (Pressão longa!)
Menu popup
1. Chame o novo PopupMenu (contexto de contexto, Exibir âncora) para criar um menu suspenso, âncora representa o componente que deseja ativar o menu pop-up
2. Chame o método inflate () de MenuInflater para preencher o recurso de menu no PopupMenu
transformar super.onOptionsItemSelected (item);
}
return true;
}
}
Menu popup
1. Chame o novo PopupMenu (contexto de contexto, Exibir âncora) para criar um menu suspenso, âncora representa o componente que deseja ativar o menu pop-up
2. Chame o método inflate () de MenuInflater para preencher o recurso de menu no PopupMenu
3. Chame o método show () do PopupMenu para exibir o menu pop-up
package com.example.myapplication;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.menu.MenuPopupHelper;
import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.TextView;
import android.widget.Toast;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class MainActivity extends AppCompatActivity {
//定义按钮的全局变量
private Button button;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 绑定按钮的资源(利用id找到xml文件中的按钮)
button = findViewById(R.id.button);
textView = findViewById(R.id.textView);
registerForContextMenu(textView);
button.setOnClickListener(new View.OnClickListener() {
@SuppressLint("RestrictedApi")
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onClick(View v) {
//创建PopupMenu
PopupMenu popupMenu = new PopupMenu(MainActivity.this,button);
//加载菜单资源
popupMenu.getMenuInflater().inflate(R.menu.menu2, popupMenu.getMenu());
//菜单事件监听
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()){
case R.id.bu1:
Toast.makeText(MainActivity.this,"复制",Toast.LENGTH_LONG).show();
break;
case R.id.bu2:
Toast.makeText(MainActivity.this,"粘贴",Toast.LENGTH_LONG).show();
break;
case R.id.bu3:
Toast.makeText(MainActivity.this,"清除",Toast.LENGTH_LONG).show();
break;
default:
break;
}
return true;
}
});
//使用反射,强制显示菜单图标
try {
Field field = popupMenu.getClass().getDeclaredField("mm");
field.setAccessible(true);
MenuPopupHelper menuPopupHelper = (MenuPopupHelper) field.get(popupMenu);
menuPopupHelper.setForceShowIcon(true);
}catch (IllegalAccessException | NoSuchFieldException e){
e.printStackTrace();
}
popupMenu.show();
}
});
}
}
///
///
///