Comment puis-je reproduire quelque chose comme je l'ai fait ci-dessous dans Balsamiq?
J'ai fait ce menu, mais il affiche seulement le texte des éléments (pas les icônes). Est-il possible d'afficher le titre et l'icône dans un PopupMenu?
Voici mon create_post_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item
Android:id="@+id/action_photo"
Android:icon="@drawable/ic_action_camera"
Android:title="@string/action_photo"
Android:showAsAction="always|withText" />
<item
Android:id="@+id/action_video"
Android:icon="@drawable/ic_action_video"
Android:title="@string/action_video"
Android:showAsAction="always|withText" />
<item
Android:id="@+id/action_text"
Android:icon="@drawable/ic_action_edit"
Android:title="@string/action_text"
Android:showAsAction="always|withText" />
<item
Android:id="@+id/action_link"
Android:icon="@drawable/ic_action_web_site"
Android:title="@string/action_link"
Android:showAsAction="always|withText" />
</menu>
Modifier
Voici mes méthodes onCreateOptionsMenu
et onOptionsItemSelected
:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_new) {
View menuItemView = findViewById(R.id.action_new);
PopupMenu popupMenu = new PopupMenu(this, menuItemView);
popupMenu.inflate(R.menu.create_post_menu);
popupMenu.show();
return true;
} else if(item.getItemId() == R.id.action_search) {
return true;
} else if(item.getItemId() == R.id.action_settings) {
startActivity(new Intent(MainActivity.this, SettingsActivity.class));
return true;
} else if(item.getItemId() == R.id.action_help) {
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
J'ai résolu ce problème en plaçant simplement le create_post_menu
à l'intérieur de la item
dont l'icône est un +
.
Par exemple, j'ai (avec AppCompat):
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/action_new"
Android:icon="@drawable/ic_action_new"
Android:title="@string/action_new"
app:showAsAction="always">
<menu>
<item
Android:id="@+id/action_photo"
Android:icon="@drawable/ic_action_camera"
Android:title="@string/action_photo"
app:showAsAction="always|withText" />
<item
Android:id="@+id/action_video"
Android:icon="@drawable/ic_action_video"
Android:title="@string/action_video"
app:showAsAction="always|withText" />
<item
Android:id="@+id/action_text"
Android:icon="@drawable/ic_action_text"
Android:title="@string/action_text"
app:showAsAction="always|withText" />
<item
Android:id="@+id/action_place"
Android:icon="@drawable/ic_action_place"
Android:title="@string/action_place"
app:showAsAction="always|withText" />
<item
Android:id="@+id/action_more"
Android:title="@string/action_more"
Android:visible="false"
app:showAsAction="always|withText" />
</menu>
</item>
...(more menu items here)
</menu>
Sans AppCompat, vous pouvez simplement vous débarrasser de l'espace de noms XML app
en remplaçant app
par Android
.
import Android.os.Bundle;
import Android.app.Activity;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.PopupMenu;
import Android.widget.Toast;
public class MainActivity extends Activity {
Button button1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 = (Button) findViewById(R.id.button1);//your created butto
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Creating the instance of PopupMenu
PopupMenu popup = new PopupMenu(MainActivity.this, button1);
//Inflating the Popup using xml file
popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
//registering popup with OnMenuItemClickListener
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(MainActivity.this,"You Clicked : " + item.getTitle(),Toast.LENGTH_SHORT).show();
return true;
}
});
popup.show();//showing popup menu
}
});//closing the setOnClickListener method
}
}
J'espère que ma réponse précédente Ici peut vous aider.
Si vous souhaitez simplement un menu contextuel similaire, vous pouvez utiliser ActionProvider. C'est plus puissant.
Si vous le voulez comme un vrai menu, vous pouvez utiliser le PopupMenu personnalisé.