首先我的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”问题就能解决。纯属参考。
问题:总提示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的是哪个包下的。”