我觉得我一定会错过一些疯狂的东西。我正在转换我编写的代码以使用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代码。
答案 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。
使用android.support.v7类型的ActionBar Activity。
import android.support.v7.app.ActionBarActivity;
使用getSupportActionBar()代替getActionBar()
android:theme =“@ android:style / Theme.NoTitleBar”//删除此行
requestWindowFeature(Window.FEATURE_ACTION_BAR);
答案 3 :(得分:0)
在您的清单中,您应该使用主题Theme.Sherlock
而不是Theme.Holo
。
您需要延长SherlockActivity
或SherlockFragmentActivity
。
要在使用ABS时返回ActionBar
来电getSupportActionBar
。
此外,您无需致电Window.FEATURE_ACTION_BAR
。使用Holo主题就足够了。
来自ActionBarSherlock docs
Action Bar API
创建活动以在所有版本的活动栏上使用操作栏 Android,您必须声明您的活动以扩展任何活动 以'Sherlock'开头的课程(例如,SherlockActivity, SherlockFragmentActivity)。处理与操作栏的交互 通过调用getSupportActionBar()(而不是getActionBar())。