andoroid

xiaoxiao2021-02-28  125

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

转载请注明原文地址: https://www.6miu.com/read-45501.html

最新回复(0)