3

私は何かクレイジーなものを見逃しているに違いないと感じています。ABS で動作するように記述されたコードを変換し (実際に動作しました)、ネイティブの ActionBar を使用するように切り替えています。最小 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);
    }
}

私は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) で実際が null でないことを期待しています

Robolectric 2.0 Alpha 2を使用していることを付け加えておきます。テストをスキップして apk をパッケージ化したActionBarところ、正常に動作しているように見えたので、これは Robolectric の問題に違いないと感じていますか? しかし、ネイティブ Android コードを実行していたので、ネイティブ Android でも問題なく動作するはずだと思いました。

4

4 に答える 4

4

この質問はかなり古いですが、誰かが同じ問題に直面した場合に備えて、私の解決策を投稿します。

私は、Robolectric 2.3、minSDK 16 を使用し、ネイティブの ActonBar を使用していたにもかかわらず、getActionBar()が returnign null を保持していた Dandre と同じ問題に直面していました。解決策は、私のスタイルが明示的に ActionBar に言及しているテーマを参照していることを確認することでした。私の場合、Theme.Lightを使用していました。テーマをTheme.Holo.Light.DarkActionBarに変更することで、動作するようになりました。彼のテーマがTheme.Holoであることを考えると、Dandre にも同じ問題があったと思います。

アプリに影響がないことを考えると、テーマが問題の原因だったのは奇妙だと思います。多分誰かが理由を説明できますか?

于 2014-01-01T10:20:37.530 に答える
1

FragmentActivity の代わりに ActionBarActivity を拡張します。

  • ActionBarActivity は FragmentActivity を内部的に拡張しているため、心配する必要はありません。
  • android.support.v7 タイプの ActionBar アクティビティを使用します。

    import android.support.v7.app.ActionBarActivity;
    

getActionBar() の代わりに getSupportActionBar() を使用します

  • マニフェスト ファイルをチェックインします。NoTitleBar テーマが使用されている場合は、その行を削除します

android:theme="@android:style/Theme.NoTitleBar" // この行を削除

  • それでも問題が解決しない場合は、setContentView() メソッドの上で FEATURE_ACTION_BAR を使用します。

requestWindowFeature(Window.FEATURE_ACTION_BAR);

于 2015-01-20T11:27:53.323 に答える
0

マニフェストでは、のTheme.Sherlock代わりにテーマを作成する必要がありTheme.Holoます。

SherlockActivityまたはを拡張する必要がありますSherlockFragmentActivity

ABS を使用しているときにActionBarコールを返すには。getSupportActionBar

また、電話する必要はありませんWindow.FEATURE_ACTION_BAR。Holo テーマを使用するだけで十分です。

ActionBarSherlock ドキュメントから

アクションバー API

Android のすべてのバージョンでアクション バーを使用するアクティビティを作成する場合は、アクティビティを宣言して、「Sherlock」で始まるアクティビティ クラス (SherlockActivity、SherlockFragmentActivity など) を拡張する必要があります。アクション バーとの対話は、(getActionBar() の代わりに) getSupportActionBar() を呼び出すことによって処理されます。

ここでドキュメントを読むことができます

ABS のスタイリングについて詳しくは、こちらをご覧ください。

于 2013-03-23T04:11:31.347 に答える