Android ToolBar上的toolbar menu图标大小怎么在点击之后更换

关于actionbar&,&toolbar&上右侧点点点的配置总结
1.增加oncreateMenu()
public boolean onCreateOptionsMenu(Menu menu){
&&&&&&&&&&&&
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.main_menu, menu);
mMenuItem = menu.findItem(R.id.menu_name);
mMenuItem.setTitle(getResources().getString(R.string.app));
return super.onCreateOptionsMenu(menu);
2.最新版的其实support包提供的ActionBarActivity,让自己的baseActivity继承于ActionBarActivity
对于那三个点菜单的话,标准叫法叫做:action overflow button
但是是只在Android
3.0 (API level 11)&+才会出现的
低版本的(Android
2.3.x (API level 10) or lower)对应的叫做:overflow
menu,效果(不是三个点)而是More那个按钮
不论是三个点还是More按钮,作用都很明显,都表示点击后可以看到更多的按钮菜单
这些更多的菜单,都是由于之前低版本的6个Menu界面放不下了,或者是新版本的actionBar中没位置显示了,才放到这个overflow
menu/button中的。
而是否放到overflow中,是通过对应的android:showAsAction参数来决定的。
android:showAsAction="ifRoom"
说的就是:
如果actionbar中放不下,就放到overflow中去。
如果想百分之百让他在overflow中去,就把item都配置成:&&&android:showAsAction="collapseActionView"
可参看:/articles/7BJBZb
/continue_try_add_android_actionbar_three_dot_option_menu/
http://blog.csdn.net/xiaoyaovsxin/article/details/
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。4507人阅读
Andriod 积累(269)
1)怎样修改左边这个小箭头的颜色?
2)怎样修改右边这三个点的颜色、怎样把这三个点替换成我自己的图标?
3)怎样让“交易清单”这4个字居中显示?
首先设置Theme为AppCompat.NoActionBar。
(1)toolbar可以通过设置setNavigatetionIcon,传入一个icon替换掉最左边的小箭头,但是需要自己实现其动作。
(2)在你自己的Theme定义中加入
&item name=&actionOverflowButtonStyle&&@style/OverflowButtonStyle&/item&
&style name=&OverflowButtonStyle& parent=&@android:style/Widget.ActionButton.Overflow&&
&item name=&android:src&&@drawable/float_button&/item&
&/style&&pre&&code class=&language-text&&就可以修改那三点了。&/code&
(3)我个人的做法是不使用setTitle,而是在toolBar的xml定义中插入一个TextView,然后设置其layout_gravity为center,它就在正中间了。
另外& 那个箭头显示加上这句代码
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
想要响应这个返回时间。其实就是onOptionsItemSelected()通过android.R.id.home监听得到
&pre name=&code& class=&java&& @Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == android.R.id.home){
onBackPressed();
从MainActivity中进入一个子activity中之后,如何使toolbar中左边显示一个返回箭头,点击后返回到Mainactivity中呢?其实很简单,只需要两行代码.
AndroidManifest.xml中给需要在toolbar上增加返回按钮的activity增加属性
Android:parentActivityName=”com.example.myfirstapp.MainActivity”
&application ... &
&!-- The main/home activity (it has no parent activity) --&
android:name=&com.example.myfirstapp.MainActivity& ...&
&/activity&
&!-- A child of the main activity --&
android:name=&com.example.myfirstapp.DisplayMessageActivity&
android:label=&@string/title_activity_display_message&
android:parentActivityName=&com.example.myfirstapp.MainActivity& &
&!-- Parent activity meta-data to support 4.0 and lower --&
&meta-data
android:name=&android.support.PARENT_ACTIVITY&
android:value=&com.example.myfirstapp.MainActivity& /&
&/activity&
&/application&
然后再在程序里添加一行代码就实现了
public void onCreate(Bundle savedInstanceState) {
getActionBar().setDisplayHomeAsUpEnabled(true);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:787272次
积分:14505
积分:14505
排名:第879名
原创:634篇
转载:316篇
译文:11篇
评论:421条
QQ讨论群:
微信:chenyu_920310
(3)(17)(20)(24)(21)(30)(26)(97)(47)(35)(29)(41)(30)(43)(49)(52)(32)(18)(2)(14)(10)(44)(67)(57)(63)(52)(38)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'警示:本文所述的方法过于繁琐,逻辑混乱,代码难以适应复杂情况,并且几乎不可扩展,本文之所以没删是我为了记录自己的踩坑记录,因此如果有人想参照这方面的知识,请参考我的另一篇文章:
大家都知道,Fragment的启动速度比Activity快很多,因此在开发中如果每一个界面都使用一个Activity显然不那么好,这时候我们一般用Activity来充当管理的角色,界面的内容都放在Fragment中。可是由于每个Fragment都对应一个功能界面,因此每个Fragment的顶部工具栏都应该是不同的,但是ActionBar或者ToolBar都是属于Activity的,这时候我们就需要在切换Fragment的时候使Toolbar也做出相应的动态切换。
我们来举一个简单的例子,打开个人信息Activity(MyInformationActivity),布局文件如下。
&LinearLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
xmlns:app=&/apk/res-auto&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:orientation=&vertical&
tools:context=&.myinformation.MyInformationActivity&&
&android.support.v7.widget.Toolbar
android:id=&@+id/my_information_toolbar&
android:layout_width=&match_parent&
android:layout_height=&?attr/actionBarSize&
android:background=&?attr/colorPrimary&
app:theme=&@style/WhiteToolBar&&
&/android.support.v7.widget.Toolbar&
&FrameLayout
android:id=&@+id/alter_my_information_frame&
android:layout_width=&match_parent&
android:layout_height=&match_parent&&
android:id=&@+id/my_information&
android:name=&com.icon.app.myinformation.MyInformationFragment&
android:layout_width=&match_parent&
android:layout_height=&match_parent& /&
&/FrameLayout&
&/LinearLayout&布局很简单,里面只放置了一个Toolbar和第一个Fragment (MyInformationFragment),因此,只要这个Activity一启动,首先展示在用户眼前并和用户交互的就是MyInformationFragment,MyInforamtionFragment的布局文件我就不放了,直接放效果图,如下:
展示的用户信息除了头像以外,主要就是姓名,性别,友好度这三项。大家可以注意到 ,toolbar的标题是“我的信息”,右上角的MenuItem是一支笔的图片。我们要实现的是点击右上角的menuitem,创建第二个Fragment (AlterMyInformationFragment) 使其到达Activity的最顶端,覆盖当前的MyInforamtionFragment。于是,我们在onOptionsItemSelected(MenuItem item)方法中进行监听,当用户点击右上角的笔图标时,启动新的Fragment,MyInformationActivity的代码如下:
public class MyInformationActivity extends AppCompatActivity {
private AlterMyInformationF
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_information);
toolbar = (Toolbar) findViewById(R.id.my_information_toolbar);
toolbar.setTitle(&我的信息&);
setSupportActionBar(toolbar);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
private void setAlterMyInformationFragment() {
fragment = new AlterMyInformationFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.alter_my_information_frame, fragment);
transaction.addToBackStack(null);
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_my_information, menu);
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
case R.id.alter_information:
setAlterMyInformationFragment();
return super.onOptionsItemSelected(item);
注:android.R.id.home是左上角后退按钮的id。
MyInformationActivity的Menu布局文件如下所示:
&?xml version=&1.0& encoding=&utf-8&?&
&menu xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
xmlns:app=&/apk/res-auto&
tools:context=&.myinformation.MyInformationActivity&&
android:id=&@+id/alter_information&
android:orderInCategory=&100&
app:showAsAction=&ifRoom&
android:icon=&@drawable/ic_create_white_24dp&/&
&/menu&可以看到,MyInformationActivity的Toolbar中只有一个item。
现在,我们在动态变更菜单前还要做一个事情,一般toolbar最左边的后退按钮相当于back键的功能,即点击以后销毁当前的Activity,但是,我们现在的问题是,如果当前Activity展示的是MyInformationFragment,那自然没有问题,单击后退键,即销毁当前活动,但是如果我们当前处在和AlterMyInforamtionFragment的交互状态,单击后退键把当前Activity销毁了,显然是不合理的,正确的情况是应该销毁AlterMyInforamtionFragment,使用户回到和MyInformationFragment交互的状态。因此,我们需要在Activity中设置一个变量status来进行标记,用来反映当前和用户交互的Fragment到底是哪一个。因此,新增代码后Activity的代码如下所示:
public class MyInformationActivity extends AppCompatActivity {
private static final int MY_FRAGMENT = 0;
private static final int ALTER_FRAGMENT = 1;
private AlterMyInformationF
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_information);
toolbar = (Toolbar) findViewById(R.id.my_information_toolbar);
toolbar.setTitle(&我的信息&);
setSupportActionBar(toolbar);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
status = MY_FRAGMENT;
private void setAlterMyInformationFragment() {
fragment = new AlterMyInformationFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.alter_my_information_frame, fragment);
transaction.addToBackStack(null);
status = ALTER_FRAGMENT;
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_my_information, menu);
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
switch (status) {
case MY_FRAGMENT:
case ALTER_FRAGMENT:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(fragment);
status = MY_FRAGMENT;
case R.id.alter_information:
setAlterMyInformationFragment();
return super.onOptionsItemSelected(item);
}我们用两个常量来表示当前到底处在哪一个Fragment,MY_FRAGMENT表示MyInformationFragment,ALTER_FRAGMENT表示AlterMyInformationFragment。我们可以看到Activity启动的时候自动给status赋值MY_FRAGMENT,在setAlterMyInformationFragment执行的时候给status赋值ALTER_FRAGMENT。于是我们在监听后退键的时候就可以进行判断了,如果当前和用户交互的是MyInformationFragment,执行finish()销毁Activity,如果和用户交互的是AlterMyInformationFragment,则销毁Fragment,让用户回到和MyInformationFragment交互的状态。
我们处理完了后退键的问题,就该来解决动态变更toolbar的问题了。切换了Fragment,Toolbar如何相应的发生改变呢?大家平常使用菜单的时候,主要使用两个方法onCreateOptionView(Menu menu)和onOptionsItemSelected(MenuItem item),前者是加载菜单布局的,只会在Activity启动的时候调用一次,后者是对Menu中的item进行事件监听。也就是说,我们是不可能在onCreateOptionView(Menu menu)中对menu进行动态变更的。那我们来试试在onOptionsItemSelected(MenuItem
item)中进行。于是我在启动AlterMyInforamtionFragment的代码后面加了这么两行:
item.setIcon(R.drawable.ic_send_white_24dp);
toolbar.setTitle(&修改个人信息&);这样启动AlterMyInforamtionFragment后的界面如下图所示:
demo的界面还是很简单,用户可以自己修改自己的姓名和性别,看起来我们貌似实现了,这时候我们遇到一个问题,现在右上角的item的功能不再是启动新的Fragment了,而应该是用户修改好个人信息后进行提交,于是我们再次修改代码,让onOptionsItemSelected(MenuItem item)中的代码变成这样:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
switch (status) {
case MY_FRAGMENT:
case ALTER_FRAGMENT:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(fragment);
status = MY_FRAGMENT;
case R.id.alter_information:
switch (status) {
case MY_FRAGMENT:
setAlterMyInformationFragment();
item.setIcon(R.drawable.ic_send_white_24dp);
toolbar.setTitle(&修改个人信息&);
case ALTER_FRAGMENT:
fragment.postAlterInformation();
return super.onOptionsItemSelected(item);
}我们再次通过status来判断当前和用户交互的Fragment,从而决定这个item在不同状态下的功能。在ALTER_FRAGMENT状态下调用AlterMyInformationFragment类中的postAlterInformation()方法把修改好的信息通过网络发送给服务器。
看起来我们已经实现这个功能了,但是还有很重要的一点没有做,那就是点击后退键的时候我们的toolbar应该变回之前的样子,但是我们现在还没有实现。那应该怎么做呢?修改toolbar的title很容易执行,只要在监听android.R.id.home的ALTER_FRAGMENT的switch分支下加一条
toolbar.setTitle(&我的信息&);就可以了,但是变更图标似乎不那么容易,有些人说,再加一条item.setIcon(&R.drawable.ic_create_white_24dp&);不就行了吗,但是我们仔细看,我们之所以在启动AlterMyInforamtionFragment的时候能通过这条代码改变item的图标,是因为我们这行代码写在case R.id.alter_information这条switch分支下,此时的item代表的是右上角我们要修改的item。但是如果你要android.R.id.home这条switch分支下使用参数item,这个item代表的是左上角的后退键,即使执行上面那条代码,也不会有任何效果。但是,我们确实必须在点击后退键的时候改变右上角的item的图标,这就麻烦了,我找了item能调用的所有方法,没有发现能通过什么方式指定它的id,让它在非case
R.id.alter_information分支下也代表这个item。后来我在网上查阅后发现,我们应该改变一种思路,因为onCreateOptionView(Menu menu)和onOptionsItemSelected(MenuItem item)这两个方法可能不够用了。
我在网上看到很多文章发现,onPrepareOptionsMenu(Menu menu)这个方法也可以被调用多次,那我们就通过它来改变item的图标。于是MyInformationActivity的代码就变成了如下这样
public class MyInformationActivity extends AppCompatActivity {
private static final int MY_FRAGMENT = 0;
private static final int ALTER_FRAGMENT = 1;
private AlterMyInformationF
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_information);
toolbar = (Toolbar) findViewById(R.id.my_information_toolbar);
toolbar.setTitle(&我的信息&);
setSupportActionBar(toolbar);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
status = MY_FRAGMENT;
private void setAlterMyInformationFragment() {
fragment = new AlterMyInformationFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.alter_my_information_frame, fragment);
transaction.addToBackStack(null);
status = ALTER_FRAGMENT;
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_my_information, menu);
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
switch (status) {
case MY_FRAGMENT:
case ALTER_FRAGMENT:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(fragment);
status = MY_FRAGMENT;
invalidateOptionsMenu();
toolbar.setTitle(&我的信息&);
case R.id.alter_information:
switch (status) {
case MY_FRAGMENT:
setAlterMyInformationFragment();
item.setIcon(R.drawable.ic_send_white_24dp);
toolbar.setTitle(&修改个人信息&);
case ALTER_FRAGMENT:
fragment.postAlterInformation();
return super.onOptionsItemSelected(item);
public boolean onPrepareOptionsMenu(Menu menu) {
menu.findItem(R.id.alter_information).setIcon(R.drawable.ic_create_white_24dp);
return super.onPrepareOptionsMenu(menu);
调用invalidateOptionsMenu()方法的地方,onPrepareOptionsMenu(Menu menu)就会被调用一次,值得说明的是,网上许多文章的教程写的是,如果你使用的是系统原生的ActionBar,应调用mActivity.getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);
如果使用的是ActionBarSherlock就应调用invalidateOptionsMenu(),目前大家可能使用ActionBar的逐渐减少,都逐步转向了Toolbar,Toolbar和ActionBarSherlock一样,都是调用invalidateOptionsMenu()方法。
日最新更新:又经过了两个月的学习,我又遇到了更为复杂的问题,比如一个activity可能会管理三个甚至更多的Fragment,这时候我这篇博客写的解决方法就不太灵了,会让代码既复杂又臃肿,而且难以阅读。不过我已经找到了新的解决方法,通过冲分利用Fragment的返回栈模拟以及Fragment的生命周期回调,可以更简单易懂的解决这个问题,过段时间我会把最新的方法再写一篇博客。
本文已收录于以下专栏:
相关文章推荐
之前发过一篇关于Activity中的Toolbar在搭配Fragment使用的时候动态切换item图标的文章,但是随着学习的深入,需求的复杂,以前的那种解决方法在我看来已经越来越不适用了,于是我决定用...
Android动态修改ToolBar的Menu菜单效果图实现
实现很简单,就是一个具有3个Action的Menu,在我们滑动到不同状态的时候,把对应的Action隐藏了。
GridView与之前我们熟悉的ListView(现在基本已被RecycleView所替代)一样都是比较常用的多控件布局,他们都是AdapterView的子类,不同的是GridView可以一行显示多个...
ToggleButton:有两种状态的Button(选中和未选中),可显示为不同的文本或者状态属性:
android:checked=”ture”
按钮是否被选中
android:textOff...
转载请标明出处:http://blog.csdn.net/android_ls/article/details/8765193
       在前面几讲中,左侧菜单(左侧面板)、满足滑动或点击子Vi...
转载请标明出处:http://blog.csdn.net/android_ls/article/details/8765193
       在前面几讲中,左侧菜单(左侧面板)、满足滑动或点...
为何八十老太裸死街头丶为何农户家的母猪夜夜惨叫丶为何尼姑家的房门夜夜被敲! 欢迎收看走进安卓之亮闪闪的不归路
1、drawerlayout是谷歌官方的侧滑菜单布局,drawerlayout下的第一个布局被视为主布局,第二个被视为左滑菜单,第三个为右滑菜单&android.support.v7.widget.T...
就像Swing里面的Action一样,Qt里面也有一个类似的类,叫做QAction。顾名思义,QAction类保存有关于这个动作,也就是action的信息,比如它的文本描述、图标、快捷键、回调函数(也...
他的最新文章
讲师:姜飞俊
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Android中捕捉menu按键点击事件的方法_Android
作者:用户
本文讲的是Android中捕捉menu按键点击事件的方法_Android,
本文实例讲述了Android中捕捉menu按键点击事件的方法。分享给大家供大家参考。具体如下:
public boolean onCreateOptionsMenu(Menu menu) {
本文实例讲述了Android中捕捉menu按键点击事件的方法。分享给大家供大家参考。具体如下:
public boolean onCreateOptionsMenu(Menu menu) {
* add()方法的四个参数,依次是: 1、组别,如果不分组的话就写Menu.NONE,
* 2、Id,这个很重要,Android根据这个Id来确定不同的菜单 3、顺序,那个菜单现在在前面由这个参数的大小决定
* 4、文本,菜单的显示文本
menu.add(Menu.NONE, Menu.FIRST + 1, 5, "删除").setIcon(android.R.drawable.ic_menu_delete);
// setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,同学们留意一下,以
// android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的
menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon(android.R.drawable.ic_menu_edit);
menu.add(Menu.NONE, Menu.FIRST + 3, 6, "帮助").setIcon(android.R.drawable.ic_menu_help);
menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加").setIcon(android.R.drawable.ic_menu_add);
menu.add(Menu.NONE, Menu.FIRST + 5, 4, "详细").setIcon(android.R.drawable.ic_menu_info_details);
menu.add(Menu.NONE, Menu.FIRST + 6, 3, "发送").setIcon(android.R.drawable.ic_menu_send);
// return true才会起作用
// 菜单项被选择事件
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case Menu.FIRST + 1:
Toast.makeText(this, "删除菜单被点击了", Toast.LENGTH_LONG).show();
case Menu.FIRST + 2:
Toast.makeText(this, "保存菜单被点击了", Toast.LENGTH_LONG).show();
case Menu.FIRST + 3:
Toast.makeText(this, "帮助菜单被点击了", Toast.LENGTH_LONG).show();
case Menu.FIRST + 4:
Toast.makeText(this, "添加菜单被点击了", Toast.LENGTH_LONG).show();
case Menu.FIRST + 5:
Toast.makeText(this, "详细菜单被点击了", Toast.LENGTH_LONG).show();
case Menu.FIRST + 6:
Toast.makeText(this, "发送菜单被点击了", Toast.LENGTH_LONG).show();
// 选项菜单被关闭事件,菜单被关闭有三种情形,menu按钮被再次点击、back按钮被点击或者用户选择了某一个菜单项
public void onOptionsMenuClosed(Menu menu) {
Toast.makeText(this, "选项菜单关闭了", Toast.LENGTH_LONG).show();
// 菜单被显示之前的事件
public boolean onPrepareOptionsMenu(Menu menu) {
Toast.makeText(this, "选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单", Toast.LENGTH_LONG).show();
// 如果返回false,此方法就把用户点击menu的动作给消费了,onCreateOptionsMenu方法将不会被调用
希望本文所述对大家的Android程序设计有所帮助。
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
slidingmenu点击事件、android menu点击事件、menuitem点击事件、menu点击事件、toolbar menu点击事件,以便于您获取更多的相关知识。
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供
云栖社区()为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!}

我要回帖

更多关于 menu图标 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信