getActionBar()== null当它不应该时

时间:2013-03-23 02:51:34

标签: android android-actionbar actionbarsherlock android-4.0-ice-cream-sandwich robolectric

我觉得我一定会错过一些疯狂的东西。我正在转换我编写的代码以使用ABS(它确实有效),并将其切换为使用本机ActionBar。我将min SDK设置为14并为框架版本切换了一些东西,现在我无法让ActionBar存在。

我的Activity

public class HomeActivity extends Activity {

    @Override
    protected void onCreate(@CheckForNull Bundle icicle) {
        super.onCreate(icicle);
        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
    }
}

我的AndroidManifest:

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17"/>
...
<activity android:launchMode="singleTop" android:name=".ui.HomeActivity" android:theme="@android:style/Theme.Holo">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
    <meta-data android:name="target device" android:value="universal"/>
</activity>

我的Robolectric测试:

@RunWith(RobolectricTestRunner.class)
public class HomeActivityTest {

    @Test
    public void testActionBarDisplay() {
        // Given
        final HomeActivity activity_under_testing = new HomeActivity();

        // When
        activity_under_testing.onCreate(null);

        // Then
        assertThat(activity_under_testing.getActionBar())
        .hasDisplayOptions(ActionBar.DISPLAY_SHOW_HOME
                           |ActionBar.DISPLAY_SHOW_TITLE
                           |ActionBar.DISPLAY_USE_LOGO);
    }
}

我正在为assertThat使用FEST-Android(可能不是问题)。

问题:

  

测试运行:1,失败:1,错误:0,跳过:0,经过的时间:7.563秒&lt;&lt;&lt;失败!   testActionBarDisplay(com.imminentmeals.android.base.ui.HomeActivityTest)经过的时间:6.588秒&lt;&lt;&lt;失败!   java.lang.AssertionError:期望实际不为null       在com.imminentmeals.android.base.ui.HomeActivityTest.testActionBarDisplay(HomeActivityTest.java:28)

我应该补充说我正在使用 Robolectric 2.0 Alpha 2 。我跳过测试,并打包我的apk,ActionBar似乎工作正常,所以我觉得这必须是一个Robolectric问题?但我认为它应该适用于原生Android,因为它运行原生Android代码。

4 个答案:

答案 0 :(得分:4)

这个问题相当陈旧,但如果有人遇到同样的问题,我会发布我的解决方案。

我遇到了与Dandre相同的问题,我使用Robolectric 2.3,minSDK 16,并使用原生ActonBar但 getActionBar()保持returnign null。解决方案是确保我的风格是指一个明确提到ActionBar的主题。就我而言,我使用 Theme.Light 。通过将主题更改为 Theme.Holo.Light.DarkActionBar ,我得到了它的工作。我认为Dandre有同样的问题,因为他的主题是 Theme.Holo

我发现主题是导致问题的原因很奇怪,因为它不会影响我的应用程序。也许有人可以解释为什么?

答案 1 :(得分:1)

如果您使用ActionBarDrawerToggle 把getActionBar()放在onDrawerOpened(View drawerView){}中 public void onDrawerOpened(View drawerView) { title = getActionBar().getTitle(); getActionBar().setTitle("Open Drawer"); }

答案 2 :(得分:1)

  

扩展ActionBarActivity以取代FragmentActivity。

  • ActionBarActivity在内部扩展了FragmentActivity,因此无需担心。
  • 使用android.support.v7类型的ActionBar Activity。

    import android.support.v7.app.ActionBarActivity;
    
  

使用getSupportActionBar()代替getActionBar()

  • 签入您的清单文件,如果使用NoTitleBar主题,则删除该行
  

android:theme =“@ android:style / Theme.NoTitleBar”//删除此行

  • 如果仍未解决问题,请在setContentView()方法上方使用FEATURE_ACTION_BAR。
  

requestWindowFeature(Window.FEATURE_ACTION_BAR);

答案 3 :(得分:0)

在您的清单中,您应该使用主题Theme.Sherlock而不是Theme.Holo

您需要延长SherlockActivitySherlockFragmentActivity

要在使用ABS时返回ActionBar来电getSupportActionBar

此外,您无需致电Window.FEATURE_ACTION_BAR。使用Holo主题就足够了。

来自ActionBarSherlock docs

  

Action Bar API

     

创建活动以在所有版本的活动栏上使用操作栏   Android,您必须声明您的活动以扩展任何活动   以'Sherlock'开头的课程(例如,SherlockActivity,   SherlockFragmentActivity)。处理与操作栏的交互   通过调用getSupportActionBar()(而不是getActionBar())。

You can read the docs here

You can read more about styling ABS here