andoroid_ActionBar_遇见的错误

首先我的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的是哪个包下的。”










  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值