andoroid_ActionBar_遇见的错误

原创 2017年07月11日 00:16:13

首先我的sdk版本是25的,同时anctivity继承的是appCompatActivity

1.1 问题:  不清楚什么原因,默认不显示activityBar的左上角图标。

解决方法是:

        actionBar = getSupportActionBar();
        actionBar.setIcon(R.mipmap.brild);
        actionBar.setDisplayShowHomeEnabled(true);

注意:当使用AppCompatActivity或其他support包中的基类,那么获得ActionBar实例需要用另一个相应的方法

,那就是getSupportActionBar(),ActionBar也要使用相应support包下的。

这样就能正常显示图标了。


1.2  问题:如何彻底清除actionbar的左上角的图标。

首先:在res/values/styles.xml文件中修改主题风格:

<!-- remove sms actionbar icon
     changed theme="@style/MmsHoloTheme to theme="@style/NoActionbarIconTheme -->
<style name="NoActionbarIconTheme" parent="@android:style/Theme.Holo.Light">
     <item name="android:actionBarStyle">@style/MyNoActionBarIconStyle</item>
</style>
<style name="MyNoActionBarIconStyle" parent="@android:style/Widget.Holo.Light.ActionBar">
     <item name="android:displayOptions">showTitle</item>
</style>
最后:清单文件中更改当前Activity的Theme风格:

android:theme="@style/NoActionbarIconTheme"


2.通过actionBar图标进行导航时,如果ActivityA--跳转到ActivityB后,给ActivityB启用actionbar图标导航功能:

问题:添加导航功能后,按返回图标没反应。

解决方法是:在onOptionItemSelected方法中,case 的ID必须特别定义为:android.R.id.home:这样才能实现返回上一界面。

@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setTitle("天气");  
    setContentView(R.layout.activity_main);  
    ActionBar actionBar = getActionBar();  
    actionBar.setDisplayHomeAsUpEnabled(true); 
}  


@Override  
public boolean onOptionsItemSelected(MenuItem item) {  
    switch (item.getItemId()) {  
    case android.R.id.home:  
        finish();  
        return true;  
    ……  
    }  
}  

    2.1 正常看来actionBar与back键实现的效果是一样的,可是导航功能真正想实现的效果是:无论你从这个界面进入到另一个界面或者再进入到另一个界面,

    如果这个时候按导航键,它最终都返回到最开始的界面,而back键的效果只能一层一层回退,这就是actionbar的不同之处。

    假如我是从ActivityA 进入 ActivityB 再进入ActivityC界面,我现在需要从ActivityC界面按导航键直接返回到ActivityA上。

    实现方式:

      2.1.1  在ActivityC的Ocreate下添加如下代码,创建导航功能

        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);

      2.1.2  在AndroidMenifest中ActivityC中配置父ActivityA

        <activity android:name=".ActivityC"
            android:parentActivityName="com.revoview.actionbae_activity.ActivityA"></activity>

     2.1.3   需要在ActivityC文件onOptionsItemSelected(MenuItem item)方法中,对Android.R.id.home:进行特殊处理:

            case android.R.id.home:
                Intent upIntent  = NavUtils.getParentActivityIntent(this);
                if(NavUtils.shouldUpRecreateTask(this,upIntent)){
                    TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent)
                            .startActivities();
                }else{
                    upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    NavUtils.navigateUpTo(this,upIntent);
                }
                return  true;
      其中NavUtils.getParentActivityIntent是获得父Activity的Intent,通过shouldUpRecreateTask判断父Activity是否在回栈当中(是否在同一个任务当中),

      如不在返回true,创建一个新的任务, 否则直接调用NavUtils.navigateUpTo直接跳转。

      注:好像在不经意间看见过类似的问题,没有验证,说每次跳转至父Activity时,Activity都会先destory(),在重新Ocreate,解决的方法是在父Activity

      中android:launchMode="singleTop”问题就能解决。纯属参考。




3.给Activity添加菜单选项时,设置菜单风格为showAsAction

问题:总提示android:showAsAction="ifRoom"   错误,存在下划线。

解决的方法:

1.将android:showAsAction="ifRoom"改为app:showAsAction="ifRoom"

2.加入xmlns:app="http://schemas.android.com/apk/res-auto"

<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"
    tools:context="com.revoview.actionbae_activity.MainActivity">

   <item
    android:id="@+id/action_add"
    android:icon="@android:drawable/ic_input_add"
    app:showAsAction="ifRoom"
    android:title="@string/actionbar_add"
    />


4.将searchView控件添加到actionbar上,不用进入其他界面,直接在当前界面进行搜索功能。

问题:添加searchView控件到actionbar后,点击searchView图标,没有反应,不能进入搜索编辑界面。

解决方法:

原代码:

    <item  
        android:id="@+id/action_search"  
        android:icon="@drawable/ic_action_search"  
        android:actionViewClass="android.widget.SearchView"  
        android:showAsAction="ifRoom|collapseActionView"  
        android:title="@string/action_search" /> 
修改后解决问题的代码:

    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="always|collapseActionView"
        android:title="@string/action_search"
        />


5.Actionbar上添加Shared(分享菜单)

问题:item.getActionProvider()时不能转换类型到ShareActionProvider。

解决方法:

1、首先在菜单xml文件中添加ShareActionProvider的item:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"  >
<item
    android:id="@+id/action_share"
    app:actionProviderClass ="android.support.v7.widget.ShareActionProvider"
    android:title="share_menu"
    app:showAsAction="ifRoom"
    />
</menu>
注意:actionProviderClass 它有两张添加方式,下面一起解释:

      A android:actionProviderClass="android.widget.ShareActionProvider"

      B app:actionProviderClass ="android.support.v7.widget.ShareActionProvider"

2、在Activity中定义ShareActionProvider:

     private ShareActionProvider mShareActionProvider;
     注意到导入的包是:import
     android.support.v7.widget.ShareActionProvider, 与xml文件中保持一致。


3、在onCreateOptionsMenu()中获取ShareActionProvider,并设置Intent:

    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main,menu);
        MenuItem shareItem = menu.findItem(R.id.action_share);
        shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
        shareActionProvider.setShareIntent(getDefaultIntent());
        return super.onCreateOptionsMenu(menu);
    }

    private Intent getDefaultIntent(){
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("image/*");
        startActivity(intent);
        return intent;
    }
}
这里说下我自己的想法,被这个问题搞了很久,至今都没想明白原因,下面是在网上找来的信息,应该就是下面这个原因:

确保你用到的类是在同一个包里的,例如MenuItemCompat 是 v4的兼容包里的 而 ActionProvider , 在标准的sdk下有,

v4下面也有,所以MenuItemCompat.getActionProvider 返回的应该是v4下面的那个类的对象。 而ShareActionProvider  

这个在标准sdk下有,v7下面也有。你看看你import的是哪个包下的。”










版权声明:本文为博主原创文章,未经博主允许不得转载。

SpringMVC和mybatis整合时遇见的错误

在SpringMVC和mybatis整合时遇见个问题,我整合SSM框架时候,spring+mybatis用单元测试是可以运行的,增删改查都没问题。SpringMVC也是可以运行的,WEB-INF目录下...
  • qq_37960629
  • qq_37960629
  • 2017年08月19日 02:23
  • 144

新上任主管10个常犯的错误

当你在工作上表现优异,你信心十足地期待着获得晋升,而你的上司亦觉得需要给你一点鼓励,于是给你升职加薪,让你管理一个小组。但结果是:你管理的部门工作质量下降了、你应有的表现没能发挥、其他同事亦怨声载道…...
  • zhouyong0
  • zhouyong0
  • 2013年05月19日 02:01
  • 724

hibernate遇见的错误

关于hibernate遇见:An AnnotationConfiguration instance is required to use 的报错 hibernate在3.2版本以后,可以采用注解的方...
  • pascalkk
  • pascalkk
  • 2012年10月19日 17:40
  • 263

C语言编程时遇到的若干问题

还是基础不够扎实,有一些基本的问题都不是很清楚,这里记录一下,以备遗忘。1.关于sizeof与strlen如果变量是数组,那么调用sizeof的结果就是数组的大小,但是如果只是一个指针,那么他只是返回...
  • vspiders
  • vspiders
  • 2018年01月18日 11:05
  • 58

tensorflow 遇见的错误

这个bolg主要讲自己使用tensorflow踩过得坑 (1)TypeError: The value of a feed cannot be a tf.Tensor object. Accepta...
  • qq1483661204
  • qq1483661204
  • 2018年01月02日 10:18
  • 93

angualr2遇见的错误

本人正在学习angular2,将遇见的错误全部写下,会不断更新! core.es5.js:1084 1.ERROR Error: Uncaught (in promise): Error...
  • qq_32844875
  • qq_32844875
  • 2017年05月09日 17:08
  • 185

hadoop遇见的错误

一:put: `input': No such file or directory 错误来源: bin/hdfs dfs -put etc/hadoop input 解决方案: bin/hadoop ...
  • itworkermk
  • itworkermk
  • 2016年09月01日 17:24
  • 1082

struts2遇见的错误

1.The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the ass...
  • pascalkk
  • pascalkk
  • 2012年10月22日 10:52
  • 325

过程中遇见的错误

将datamodule 放到另一个包中,调用的时候提示空指针,也就是没创建了。后来仔细检查,发现我把datamodule上的 Global 去掉了,而在global.pas 的初始化的时候,我创建了d...
  • u010673851
  • u010673851
  • 2017年05月18日 17:28
  • 122

盈一指风华,浅梦一程。生命的美丽

盈一指风华,浅梦一程。生命的美丽,也许就是源于每一天盼望和遇见。遇见美丽的自己,遇见喜欢的友人,欢喜于每一天的点点滴滴,简单着,却是真切的快乐着。仰望45度的角,让一朵微笑妆点自己的容颜,向着日光,暖...
  • u014036240
  • u014036240
  • 2014年03月11日 14:50
  • 313
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:andoroid_ActionBar_遇见的错误
举报原因:
原因补充:

(最多只允许输入30个字)