Voici ce que j'essaie d'implémenter: lorsque les utilisateurs cliquent sur le menu situé dans le coin supérieur droit de la barre d'outils, un menu d'options apparaît en bas de l'écran. Voir l'image ci-dessous:
Je ne suis pas sûr de quelle méthode devrais-je appeler pour l'élément en bas. Quelqu'un peut-il me donner un indice sur la façon de mettre en œuvre cela?
J'implémente avec succès l'icône dans la barre de menu en haut à droite avec le code ci-dessous. Mais je ne sais pas comment afficher les options en bas de l'écran, avec la largeur match_parent
et la hauteur wrap_content
onClick dans le coin supérieur droit
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.edit_profile_image_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.more:
//How to show the 2 option in the bottom of screen here
return true;
}
return super.onOptionsItemSelected(item);
}
Mettre à jour
Après avoir implémenté le code de Nikesh, la fenêtre s’affiche comme suit:
Vous pouvez maintenant utiliser Material Design BottomAppBar
Exemple de code
Ajoutez des dépendances ci-dessous dans votre build.gradle
implementation 'com.google.Android.material:material:1.0.0'
Maintenant, créez 3 fichiers de menu dans le répertoire res/menu
bottom_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"
xmlns:tools="http://schemas.Android.com/tools">
<item
Android:id="@+id/app_bar_search"
Android:icon="@drawable/ic_search"
Android:title="Search"
app:showAsAction="ifRoom" />
<item
Android:id="@+id/app_bar_fav"
Android:icon="@drawable/ic_favorite"
Android:title="Favorite"
app:showAsAction="ifRoom"/>
<item
Android:icon="@drawable/ic_favorite"
Android:title="Favorite"
app:showAsAction=""/>
</menu>
nav_drawer_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/navItemOne"
Android:title="Nav Item 1"
app:showAsAction="never"/>
<item
Android:id="@+id/navItemTwo"
Android:title="Nav Item 2"
app:showAsAction="never"/>
<item
Android:id="@+id/navItemThree"
Android:title="Nav Item 3"
app:showAsAction="never"/>
</menu>
toolbar_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.Android.com/tools"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item
Android:id="@+id/app_bar_fav"
Android:icon="@drawable/ic_favorite"
Android:title="Favorite"
app:showAsAction="ifRoom"/>
<item
Android:id="@+id/app_bar_search"
Android:icon="@drawable/ic_search"
Android:title="Search"
app:showAsAction="ifRoom"/>
<item
Android:id="@+id/app_bar_settings"
Android:title="Settings"
app:showAsAction="never"/>
<item
Android:title="Menu Item 1"
app:showAsAction="never"/>
<item
Android:title="Menu Item 2"
app:showAsAction="never"/>
<item
Android:title="Menu Item 3"
app:showAsAction="never"/>
</menu>
Maintenant, créez un nom de classe
BottomNavigationDrawerFragment
pour ouvrir le tiroir de navigation par le bas
import Android.content.Context
import Android.os.Bundle
import Android.view.Gravity
import Android.view.LayoutInflater
import Android.view.View
import Android.view.ViewGroup
import Android.widget.Toast
import com.google.Android.material.bottomsheet.BottomSheetDialogFragment
import kotlinx.Android.synthetic.main.bottom_nav_layout.*
class BottomNavigationDrawerFragment : BottomSheetDialogFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.bottom_nav_layout, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
navigation_view.setNavigationItemSelectedListener { menuItem ->
// Bottom Navigation Drawer menu item clicks
when (menuItem!!.itemId) {
R.id.navItemOne -> context!!.toast(" Nav item one is Clicked ")
R.id.navItemTwo -> context!!.toast(" Nav item Two is Clicked ")
R.id.navItemThree -> context!!.toast(" Nav item Three is Clicked ")
}
// Add code here to update the UI based on the item selected
// For example, swap UI fragments here
true
}
}
// This is an extension method for easy Toast call
fun Context.toast(message: CharSequence) {
val toast = Toast.makeText(this, message, Toast.LENGTH_SHORT)
toast.setGravity(Gravity.BOTTOM, 0, 600)
toast.show()
}
}
Code de MainActivity
import Android.os.Bundle
import Android.view.Menu
import Android.view.MenuItem
import Android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import kotlinx.Android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// attach menu to your BottomAppBar
bottomBar.replaceMenu(R.menu.bottom_menu)
// handle click event of navigationIcon
bottomBar.setNavigationOnClickListener {
toast("Navigation Icon Clicked")
val bottomNavDrawerFragment = BottomNavigationDrawerFragment()
bottomNavDrawerFragment.show(supportFragmentManager, bottomNavDrawerFragment.tag)
}
// handle click event of FloatingActionButton
fab.setOnClickListener {
toast("Fab Icon Clicked")
}
//handle click event of menu of BottomAppBar
bottomBar.setOnMenuItemClickListener { menuItem ->
when (menuItem!!.itemId) {
R.id.app_bar_search -> toast("Search menu of bottomBar is clicked!")
}
true
}
}
// Overriding Actionbar menu
override fun onCreateOptionsMenu(menu: Menu): Boolean {
val inflater = menuInflater
inflater.inflate(R.menu.toolbar_menu, menu)
return true
}
//handle click event of menu of Actionbar
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when (item!!.itemId) {
R.id.app_bar_fav -> toast("Fav menu item of toolbar is clicked!")
R.id.app_bar_search -> toast("Search menu item of toolbar is clicked!")
R.id.app_bar_settings -> toast("Settings item of toolbar is clicked!")
else -> toast("Menu item of toolbar is clicked!")
}
return true
}
// method to display toast
private fun toast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
}
layout.activity_main
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/main_content"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="#ffffff"
Android:fitsSystemWindows="true">
<com.google.Android.material.bottomappbar.BottomAppBar
Android:id="@+id/bottomBar"
style="@style/Widget.MaterialComponents.BottomAppBar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="bottom"
app:fabCradleMargin="10dp"
app:fabCradleVerticalOffset="4dp"
Android:backgroundTint="@color/colorPrimary"
app:fabAlignmentMode="center"
app:navigationIcon="@drawable/ic_drawer"/>
<com.google.Android.material.floatingactionbutton.FloatingActionButton
Android:id="@+id/fab"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
app:layout_anchor="@id/bottomBar"
app:srcCompat="@drawable/ic_apps" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
bottom_nav_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<com.google.Android.material.navigation.NavigationView
Android:id="@+id/navigation_view"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="bottom"
Android:layout_marginStart="8dp"
Android:layout_marginTop="8dp"
Android:layout_marginEnd="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:menu="@menu/nav_drawer_menu"/>
</androidx.constraintlayout.widget.ConstraintLayout>
BottomNavigationDrawerFragment
import Android.content.Context;
import Android.os.Bundle;
import Android.view.LayoutInflater;
import Android.view.MenuItem;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.Toast;
import com.google.Android.material.bottomsheet.BottomSheetDialogFragment;
import com.google.Android.material.navigation.NavigationView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import neel.com.bottomappbar.R;
public class BottomNavigationDrawerFragment extends BottomSheetDialogFragment {
private Context mContext;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext=context;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView= inflater.inflate(R.layout.bottom_nav_layout, container, false);
NavigationView navigationView=rootView.findViewById(R.id.navigation_view);
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.navItemOne:
Toast.makeText(mContext, "Nav item One is Clicked ", Toast.LENGTH_SHORT).show();
return true;
case R.id.navItemTwo:
Toast.makeText(mContext, "Nav item Two is Clicked ", Toast.LENGTH_SHORT).show();
return true;
case R.id.navItemThree:
Toast.makeText(mContext, "Nav item Three is Clicked ", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
return rootView;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
}
Activité principale
import Android.os.Bundle;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;
import Android.widget.Toast;
import com.google.Android.material.bottomappbar.BottomAppBar;
import com.google.Android.material.floatingactionbutton.FloatingActionButton;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import neel.com.bottomappbar.R;
public class MainActivity extends AppCompatActivity {
BottomAppBar bottomAppBar;
FloatingActionButton floatingActionButton;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bottomAppBar = findViewById(R.id.bottomBar);
// attach menu to your BottomAppBar
bottomAppBar.replaceMenu(R.menu.bottom_menu);
// handle click event of navigationIcon of bottomAppBar
bottomAppBar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
BottomNavigationDrawerFragment bottomNavigationDrawerFragment = new BottomNavigationDrawerFragment();
bottomNavigationDrawerFragment.show(getSupportFragmentManager(), bottomNavigationDrawerFragment.getTag());
}
});
//handle click event of menu of BottomAppBar
bottomAppBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.app_bar_search:
Toast.makeText(MainActivity.this, "Search menu of bottomBar is clicked!", Toast.LENGTH_SHORT).show();
return true;
case R.id.app_bar_fav:
Toast.makeText(MainActivity.this, "Favorite menu of bottomBar is clicked!", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
floatingActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "Fab Is clicked ", Toast.LENGTH_SHORT).show();
}
});
}
// Overriding Actionbar menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_menu, menu);
return true;
}
//handle click event of menu of Actionbar
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.app_bar_fav:
Toast.makeText(MainActivity.this, "Fav menu item of toolbar is clicked!", Toast.LENGTH_SHORT).show();
return true;
case R.id.app_bar_search:
Toast.makeText(MainActivity.this, "Search menu item of toolbar is clicked!", Toast.LENGTH_SHORT).show();
return true;
case R.id.app_bar_settings:
Toast.makeText(MainActivity.this, "app_bar_settings", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
}
pour plus d'informations s'il vous plaît vérifier ci-dessous articles
SORTIE
https://www.youtube.com/watch?v=k145bGLrleo
essayez ceci attachez cette PopupMenu
à votre événement de clic en vue de dessous, quelque chose comme un événement de clic
étape 1 _ {créer une vue au début de votre mise en page comme ça} _
<View
Android:layout_gravity="center"
Android:id="@+id/myView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"/>
étape 2crée un fichier new_menu.xml comme celui-ci
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/temp"
Android:title="@string/str_menu_account_logout"
Android:icon="@drawable/next"
app:showAsAction="ifRoom"></item>
</menu>
ajoutez maintenant ce code pour créer un menu d'options dans votre fichier Java}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.new_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.temp) {
PopupMenu popupMenu = new PopupMenu(this, findViewById(R.id.myView),Gravity.CENTER);
popupMenu.inflate(R.menu.home_menu);
popupMenu.show();
return true;
}
return false;
}
Je suggérerai d'utiliser la barre d'applications Conception de matériaux (en bas), avec quelques modifications, vous pouvez obtenir le résultat.
Essayez ceci https://material.io/design/components/app-bars-bottom.html
espérons que cela aidera.
Answer by @Nilesh est très élaboré et un peu compliqué.
Solution simple
Créez FrameLayout et organisez vos boutons dans la structure du cadre en fonction de vos besoins. Set id - J'utilise id = "menu"
Définir la visibilité sur le système Android disparu: visibilité = "disparu"
Sur le menubutton, cliquez sur
findViewById (R.id.menu) .setVisibility (View.VISIBLE);
Maintenant, pour que le menu disparaisse lorsque vous cliquez en dehors du menu, ajoutez une vue ou une disposition vide derrière le menu. set ontouch listner. Définissez la visibilité GONE lorsque vous appuyez sur la vue d’arrière-plan.
Simple . Construisez une boîte de dialogue avec son propre contenu qui constituera le menu inférieur . Lorsque l’utilisateur clique dessus, la boîte de dialogue devrait apparaître, mais sa position serait inférieure à celle ancrée au bas. Vous pouvez trouver de nombreux codes concernant la manière de positionner la boîte de dialogue au bas de l'éboulis ancré !! SO ne pas en ajouter. J'espère que ça aide.!