2013-07-25 2 views
9

Я начал работать с NavigationDrawer использованием ActionBarSherlock и получили хорошие результаты, но моя компания одобрив это Open Source, вероятно, придет в ближайшее время нет, поэтому я работаю, чтобы переключиться на ActionBarCompat.Android: NavigationDrawer и ActionBarCompat

ActionBarCompat был официально опубликован вчера (24 июля 2013 г.). Кто-нибудь получил возможность хорошо работать друг с другом? Я надеюсь, что смогу ответить на мой собственный вопрос, но посмотрю, если кто-то получил это, чтобы работать. Гонка продолжается! :-)

YouTube на выпуске ActionBarCompat в: https://www.youtube.com/watch?v=6TGgYqfJnyc


UPDATE (рабочий код, да!): Я получил приложение образец NavigationDrawer от Google конвертируются использовать ActionBarCompat и он работает нормально. Вы можете найти его здесь в качестве ссылки или начать свой проект: https://github.com/bcrider/NavigationDrawerActionBarCompat

версия 2.x выглядит даже лучше, чем так, как это сделал с ActionBarSherlock, но я буду работать с ActionBarCompat намного больше, чтобы увидеть если мне это нравится.


+0

Я очень хочу узнать ваш опыт работы с совместимостью ActionBar и Nav drawer, я также использовал Nav drawer и ABS, и он работает нормально. –

+0

Работает отлично, за исключением пунктов меню. Проверьте этот ответ для правильного синтаксиса http://stackoverflow.com/questions/17913311/is-it-possible-to-have-a-action-bar-menu-using-the-appcompat-library – Zeezer

+0

AppMart Drawer Nav очень медленный даже на моей M860 Motorola я пробовал некоторые пользовательские библиотеки Drawer, и их производительность намного лучше. – Singgum3b

ответ

13

ПРИМЕЧАНИЕ: Я слишком новичок, чтобы добавить несколько ссылок в сообщение и т. Д., Поэтому я отвечаю на свой вопрос, а не редактирую его (надеюсь, что это не противоречит правилам?). Будет разрешено редактирование оригинала.

Простой способ добавить панель навигации с ActionBarCompat: я обнаружил, что преобразование моего существующего приложения было не так плохо, как я думал, что это будет. Образец Google привел меня к мысли, что Фрагменты были необходимостью, но это было не так ... далеко от него.

Вы можете просто обернуть существующие макеты с помощью DrawerLayout и подключить ListView (или любой макет, содержащий ListView, если на то пошло) для фактической навигации. Затем добавьте обычный код в существующее действие (расширьте ActionBarActivity) и создайте навигацию, как и следовало бы.

Вот некоторые примеры кода, с которым обернуть существующий макет:

<?xml version="1.0" encoding="utf-8"?> 

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

[YOUR EXISTING LAYOUT GOES HERE] 

    <ListView 
     android:id="@+id/left_drawer" 
     android:layout_width="300dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:background="#111" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="0dp" /> 

</android.support.v4.widget.DrawerLayout> 

Если вы хотите начать с примера приложения, который делает использовать фрагменты и идти оттуда, вот мое хранилище GitHub на основе образца кода : https://github.com/bcrider/NavigationDrawerActionBarCompat

0

Образцы, которые приходят с 4.3 SDK выглядят многообещающими, но я собираюсь создать тестовый проект и попытаться преобразовать свое собственное приложение ActionBarCompact и посмотреть, если он работает лучше или хуже, чем ActionBarSherlock! Я обновлю это сообщение, если я выиграю или нет!

+2

Наконец-то я смог вернуться к этому, и я нашел недостающий шаг в процессе интеграции. В видео не было четко указано (или явно достаточно для меня), импортирующего проект в виде библиотеки. Как только я это сделал, множество проблем исчезло. Я просто импортировал. \ Sdk \ extras \ android \ support \ v7 \ appcompat в мое рабочее пространство, а затем добавил это в свой основной проект как библиотеку. Просто копировать файлы jar, как показалось, казалось, было недостаточно. –

2

Вчера я конвертировал приложение из ActionBarSherlock в ActionBarCompat. У меня были некоторые проблемы, но ничего серьезного.

У меня есть некоторые комментарии:

Чтобы обновить темы, мне просто нужно переопределить «Шерлока», чтобы «AppCompat». Например, вместо наследования из @ style/Theme.Sherlock.Light.DarkActionBar, я наследую от @ style/Theme.AppCompat.Light.DarkActionBar.

Для деталей действия, просто обновить этот путь:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:yourapp="http://schemas.android.com/apk/res-auto" > 
    <item android:id="@+id/action_search" 
      android:icon="@drawable/ic_action_search" 
      android:title="@string/action_search" 
      yourapp:showAsAction="ifRoom" /> 
    ... 
</menu> 

И в onCreateOptionsMenu, используйте обычную MenuItem, но использовать статические методы MenuItemCompat делать вещи ActionBar в. Например: MenuItemCompat.expandActionView (searchMenuItem);

Если вы используете RoboGuice, наследующий RoboSherlockActivity, у вас возникнут проблемы, если вы просто скопируете его и перейдете в ActionBarActivity. Вот мое решение:

public class RoboActionBarActivity extends ActionBarActivity implements RoboContext { 

    protected EventManager eventManager; 
    protected HashMap<Key<?>, Object> scopedObjects = new HashMap<Key<?>, Object>(); 

    @Inject 
    ContentViewListener ignored; // BUG find a better place to put this 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     final RoboInjector injector = RoboGuice.getInjector(this); 
     eventManager = injector.getInstance(EventManager.class); 
     injector.injectMembersWithoutViews(this); 
     super.onCreate(savedInstanceState); 
     eventManager.fire(new OnCreateEvent(savedInstanceState)); 
    } 

    @Override 
    public void setContentView(int layoutResID) { 
     super.setContentView(layoutResID); 
     contentViewChanged(); 
    } 

    @Override 
    public void setContentView(View view) { 
     super.setContentView(view); 
     contentViewChanged(); 
    } 

    @Override 
    public void setContentView(View view, ViewGroup.LayoutParams params) { 
     super.setContentView(view, params); 
     contentViewChanged(); 
    } 

    @Override 
    public void addContentView(View view, ViewGroup.LayoutParams params) { 
     super.addContentView(view, params); 
     contentViewChanged(); 
    } 

    private void contentViewChanged() { 
     RoboGuice.getInjector(this).injectViewMembers(this); 
     eventManager.fire(new OnContentChangedEvent()); 
    } 

    @Override 
    protected void onRestart() { 
     super.onRestart(); 
     eventManager.fire(new OnRestartEvent()); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     eventManager.fire(new OnStartEvent()); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     eventManager.fire(new OnResumeEvent()); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     eventManager.fire(new OnPauseEvent()); 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     eventManager.fire(new OnNewIntentEvent()); 
    } 

    @Override 
    protected void onStop() { 
     try { 
      eventManager.fire(new OnStopEvent()); 
     } finally { 
      super.onStop(); 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     try { 
      eventManager.fire(new OnDestroyEvent()); 
     } finally { 
      try { 
       RoboGuice.destroyInjector(this); 
      } finally { 
       super.onDestroy(); 
      } 
     } 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     final Configuration currentConfig = getResources().getConfiguration(); 
     super.onConfigurationChanged(newConfig); 
     eventManager.fire(new OnConfigurationChangedEvent(currentConfig, newConfig)); 
    } 

    @Override 
    public void onContentChanged() { 
     super.onContentChanged(); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     eventManager.fire(new OnActivityResultEvent(requestCode, resultCode, data)); 
    } 

    @Override 
    public Map<Key<?>, Object> getScopedObjectMap() { 
     return scopedObjects; 
    } 

} 

Теперь вы начинаете ActionMode с supportStartActionMode() и импортирует ActionMode из пакета библиотеки.

Чтобы использовать SearchView, что вам нужно сделать что-то вроде этого:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <item 
     android:id="@+id/search" 
     app:actionViewClass="android.support.v7.widget.SearchView" 
     android:icon="@drawable/abc_ic_search" 
     app:showAsAction="always|collapseActionView" 
     android:title="@string/search"/> 

</menu> 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.search_menu, menu); 

    searchMenuItem = menu.findItem(R.id.search); 
    searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem); 

    if (searchView != null) { 
     searchView.setIconifiedByDefault(false); 

     SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { 
      public boolean onQueryTextChange(String newText) { 
       return true; 
      } 

      public boolean onQueryTextSubmit(String query) { 
       doSomething(query); 
       return true; 
      } 
     }; 

     searchView.setOnQueryTextListener(queryTextListener); 

    } 

    return super.onCreateOptionsMenu(menu); 
} 

Другие вещи работают без изменений, но пакет импорта.

Более подробную информацию вы можете найти здесь: http://developer.android.com/guide/topics/ui/actionbar.html.

+0

Очень приятно! Я рад, что вы упомянули кусок вида поиска, поскольку я собираюсь начать использовать это на следующей неделе или около того после того, как я (надеюсь) конвертирую с ABS на ABC. –

+0

Ну, у меня проблема с SearchView. Посмотрите здесь: http://stackoverflow.com/questions/17898282/searchview-taking-all-the-space-in-the-new-actionbarcompat –

+0

Другой дорожный блок: ActionBarCompat и использование его в MapActivity. Есть ли шанс, что вы уже прошли этот блокпост? Я разместил здесь вопрос: http://stackoverflow.com/questions/17980503/actionbarcompat-and-mapactivity –

0

Хотя приведенный пример хорош, я сделал еще один пример, который немного ближе к исходному примеру Google Navigation Drawer, так как включает в себя весь исходный код (теперь он предназначен для поддержки библиотеки) и форматирования. Только некоторые атрибуты должны были быть заменены на аналогичные, поскольку они доступны только с v11 и далее.

Скачать на: https://github.com/GunnarBs/NavigationDrawerWithActionBarCompat

Примечание: Это требует v7 AppCompat библиотека присутствовать, см http://developer.android.com/tools/support-library/setup.html для деталей.