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










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

Andoroid下检测DNS错误

Android下检测dns错误
  • bgylde
  • bgylde
  • 2016年12月30日 13:42
  • 121

Andoroid自定义Adapter的listView

MainActivity.java文件 package com.example.testlist; import java.util.ArrayList; import java.util.Has...

Andoroid高效率之ThinkAndroid配置详解

现在在移动大潮流的带动下,移动支付,互联网金融的兴起,正在推动着中国互联网+快速发展,一切的推动的前提是要有一个成型的实体来支撑,这个实体就是互联网服务,现在智能手机随处可见,4G网络也正处于快速发展...

andoroid强制下线

  • 2016年03月11日 14:51
  • 1.73MB
  • 下载

andoroid 5.1root系统

  • 2017年07月18日 16:22
  • 33KB
  • 下载

Andoroid中引用控件和自定义布局

1引用控件: 在安卓的控件中,有些组件是经常用到的比如说界面上的一条线,这种线没有任何功能,可重复使用,可以把他定义出来不断引用 定义一条线     android:layout_width=...

andoroid的ListView优化以及如何跳转到第一页

1.listView的layout的height android:layout_height="match_parent"2.利用ViewHolder装载每个item的控件的属性。 3.利用Recyc...

导出Andoroid中DB文件为Excel

在Android手机中Notes记了很多东西,但是换手机或者想备份如何处理呢。就需要导出SQLite 的DB文件。 本文操作是Note Everything,由于App程序备份了DB文件,所以导出比较...

Andoroid学习笔记05——Activity布局管理

Andoroid学习笔记05——Activity布局管理 一、           LinearLayout 线性布局      Xml属性 关系方法 ...

Android 游戏编程之从零开始-----2.1创建第一个Andoroid项目+2.2剖析Android Project 结构

2.1 创建第一个Andoroid项目   这个没有什么可说的!网上资料一大片!   简单说一下!   打开Eclipse   --->File--->New--->Project----...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:andoroid_ActionBar_遇见的错误
举报原因:
原因补充:

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