3

我觉得我一定错过了一些疯狂的东西。我正在将编写的代码转换为与 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);
    }
}

我的安卓清单:

<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);
    }
}

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

问题:

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

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

4

4 回答 4

4

这个问题相当老了,但我会发布我的解决方案,以防有人遇到同样的问题。

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

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

于 2014-01-01T10:20:37.530 回答
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);

于 2015-01-20T11:27:53.323 回答
1

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

于 2014-12-11T19:03:19.513 回答
0

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

您需要扩展SherlockActivitySherlockFragmentActivity

在您使用 ABS 时返回ActionBar呼叫。getSupportActionBar

此外,您不需要调用Window.FEATURE_ACTION_BAR. 使用 Holo 主题就足够了。

来自 ActionBarSherlock 文档

操作栏 API

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

你可以在这里阅读文档

您可以在此处阅读有关样式 ABS 的更多信息

于 2013-03-23T04:11:31.347 回答