2

Я чувствую, что, должно быть, мне не хватает чего-то сумасшедшего. Я конвертирую свой код, написанный для работы с АБС (и он действительно работал), и переключая его на использование родного ActionBar. Я установил минимальный SDK на 14 и переключил все варианты каркаса, теперь я не могу получить ActionBar.getActionBar() == null Когда это не должно быть

Мои 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 (может не возможно это проблема).

Вопрос:

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 7.563 sec <<< FAILURE! testActionBarDisplay(com.imminentmeals.android.base.ui.HomeActivityTest) Time elapsed: 6.588 sec <<< FAILURE! java.lang.AssertionError: expecting actual not to be null at com.imminentmeals.android.base.ui.HomeActivityTest.testActionBarDisplay(HomeActivityTest.java:28)

Я хотел бы добавить, что я использую Robolectric 2,0 Alpha 2. Я пропустил тест и упаковал свой apk, и ActionBar, похоже, отлично работает, так что я чувствую, что это должна быть проблема с Robolectric? Но я думал, что он отлично работает с родным Android, поскольку он запускает собственный Android-код.

ответ

0

В своем манифесте вы должны сделать тему Theme.Sherlock вместо Theme.Holo.

Необходимо удлинить SherlockActivity или SherlockFragmentActivity.

Чтобы вернуть ActionBar звонок getSupportActionBar, когда вы используете ABS.

Кроме того, вам не нужно звонить Window.FEATURE_ACTION_BAR. Достаточно использовать тему Голо.

Из ActionBarSherlock Docs

Action Bar API

When creating an activity to use the action bar on all versions of Android, you must declare your activity to extend any of the activity classes that start with 'Sherlock' (e.g., SherlockActivity, SherlockFragmentActivity). Interaction with the action bar is handled by calling getSupportActionBar() (instead of getActionBar()).

You can read the docs here

You can read more about styling ABS here

+0

Проверьте еще раз на мой вопрос, я * не * больше, используя ABS, я перешел к каркасу, мой minSDK не 14. Кроме того, Window.FEATURE_ACTION_BAR ничего не болит, и там, потому что говорится в предыдущих ответах на подобные вопросы, хотя я понимаю, что это не обязательно. Я пробовал большинство вещей, которые я могу найти. –

+0

А, мой плохой. Я неправильно понял и думал, что вы хотите переключиться на АБС. – adneal

+0

Получил это, я его перефразировал, так что это не должно повториться –

4

Этот вопрос довольно старый, но я вывешу мое решение в случае, если кто-то сталкивается с той же проблемой.

я столкнулся с той же проблемой, как Дандр, где я использовал Robolectric 2.3, minSDK 16, и с использованием нативного ActonBar и в том же getActionBar() хранится returnign нуля. Решение заключалось в том, чтобы мой стиль касался темы, в которой явно упоминается ActionBar. В моем случае я использовал Theme.Light. Изменив тему на Theme.Holo.Light.DarkActionBar, я получил ее для работы. Я считаю, что у Дандра была та же проблема, учитывая, что его тема была Theme.Holo.

Мне показалось странным, что тема была причиной проблемы, учитывая, что это не влияет на мое приложение. Может, кто-то может объяснить, почему?

+0

Спасибо за обмен, я считаю, что я убрал специфику моего имени темы, но любая тема, которая приводит к видимому ActionBar при запуске, не должна возвращать 'null' в Робоэлектрический мир. –

+0

Это то, что я так и думал, так как у моего приложения была видимая панель действий даже с Theme.Light. Я никогда не думал, что это будет причиной моей проблемы. – wschang

+0

У меня была аналогичная проблема, и я много раз смотрел на мою тему, пытаясь отлаживать, и мне это казалось правильным. Прочитав этот ответ, я внимательно посмотрел на свою тему и понял, что буду видеть то, что, как я думал, должен быть там, а не то, что на самом деле там. * вздох * так много потраченных впустую часов. – DavidsAlias

1

если вы используете ActionBarDrawerToggle поместить getActionBar() внутри onDrawerOpened (View drawerView) {} public void onDrawerOpened(View drawerView) { title = getActionBar().getTitle(); getActionBar().setTitle("Open Drawer"); }

1

Extend ActionBarActivity in place of FragmentActivity.

  • ActionBarActivity внутренне не распространяется FragmentActivity, поэтому нет необходимости беспокоиться.
  • Использование android.support.v7 type ActionBar Activity.

    import android.support.v7.app.ActionBarActivity; 
    

Use getSupportActionBar() in place of getActionBar()

  • Проверьте в вашем файле манифеста, если NoTitleBar тема используется затем удалите эту строку

android:theme="@android:style/Theme.NoTitleBar" // remove this line

  • Если до сих пор проблема не решена, то использовать FEATURE_ACTION_BAR выше метода setContentView().

requestWindowFeature(Window.FEATURE_ACTION_BAR);

+0

Хм, это, вероятно, работает, но сейчас уже старомодно, что у меня нет старого кода. –