Навигационный ящик нескольких контейнеров и лучшие практики

Я относительно новичок в разработке Android UI. Поэтому мне нужна помощь от более опытных разработчиков.
Я создаю свое приложение с Navigation DrawerЯ столкнулся с множеством проблем.
Во-первых, вот пример кода для Навигатора.

<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">
    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!-- The navigation drawer -->
    <ListView android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111"/>
</android.support.v4.widget.DrawerLayout>

Это простой пример с официального сайта.

Основное представление содержимого (FrameLayout выше) должно быть первым дочерним элементом в DrawerLayout, поскольку порядок XML подразумевает z-упорядочение, а ящик должен быть поверх содержимого.

В этом примере есть два вложенных представления: FrameLayout как упоминалось ранее для хранения основного контента и ListView для представления NavigationDrawer меню.

Итак, вот мои вопросы.

  1. Реальное приложение не имеет только одного взгляда на всю активность. В основном у Activity много разных представлений и несколько фрагментов, чтобы сделать пользовательский интерфейс более отзывчивым и улучшить пользовательский интерфейс. Мои действия - это, конечно, разные взгляды и фрагменты (какова цель этих действий?:)). В одном действии есть только один фрагмент, в другом - несколько фрагментов, поэтому они ВСЕ разные. В предыдущем примере кода ТОЛЬКО ОДИН FrameLayout контейнер для хранения фрагмента ТОЛЬКО ОДИН фрагмент, что мне делать, если в моей деятельности есть два, три или более фрагментов? Что является лучшим решением в этом случае.
  2. Как я уже описал, в моем приложении есть несколько действий, поэтому мой Навигационный ящик должен (в соответствии с практиками пользовательского интерфейса Android) работать с каждым действием, чтобы пользователь мог перейти к элементам приложения верхнего уровня. В этом случае лучше иметь один BaseActivity (Я прочитал ответы здесь на stackru), который будет содержать все вещи для конфигурации NavigationDrawer, Но насколько требуется навигационный ящик DrawerLayout в XML-макете деятельности, BaseActivity должен позвонить setContentView метод. И все досталось от BaseActivity Действия должны выполнить некоторые трюки, чтобы установить свой собственный макет, или нет смысла переопределять этот метод, потому что он сломает всю логику. Что делать в этом случае?
  3. Каков наиболее эффективный способ создания настраиваемого списка ящиков навигации, например, в Google+ или YouTube, без использования сложной иерархии представлений, которая заставляет GPU работать усердно и может принести пользователю плохой опыт

Что касается второй проблемы, у меня есть некоторые идеи, как я могу решить это, но я не знаю, является ли это правильным способом и какой подход лучше.
Первая идея - реализовать шаблон TemplateMethod. Создать метод в BaseActivity что-то вроде setupCustomViewGroup() и переопределить его во всех активностях, накачать нужную группу просмотра из XML и вернуть ее из этого метода, а затем использовать ее для надувания целого представления.

Или явно добавьте представление в Activity, используйте merge и включите тег.

Но опять же, это может быть полезно только для всей деятельности или одного фрагмента, что делать, если у нас больше фрагментов, мы используем вложенные фрагменты, я думаю, что это плохая идея.

Кроме того, моя цель - оптимизировать иерархию представлений, чтобы сделать ее быстрой и эффективной, чтобы обеспечить плавность даже на старых устройствах.

Я буду очень-очень признателен всем, кто может описать или предложить наиболее эффективный и правильный способ следовать в этом случае, чтобы сделать пользовательский интерфейс отзывчивым и читаемым кодом.

Спасибо.

3 ответа

Решение

1) Миграция из NavigationDrawer в SlideMenu (доступно на github).

2) Убедитесь, что у вашей BaseActivity нет макета вообще.

3) Раздуйте свой элемент списка через ArrayAdapter.

Надеюсь, это поможет.

Решение:

1. Я могу подумать 2 случая здесь:

  1. Несколько фрагментов, одно действие: в этом случае лучше всего replace фрагменты в FrameLayoutcontent_frame пока вы переключаетесь между фрагментами. navigation drawer содержание остается тем же для них
  2. Несколько фрагментов, несколько действий: в этом случае вы должны определить разные navigation drawer макет контента и использовать их с setHasOptionsMenu(true) звоните, когда вы переключаетесь между действиями.

2. Если вы используете ListView как navigation drawer тогда вы можете легко достичь своей работы путем динамического заполнения row из ListView, Избегайте переопределения от BaseActivity насколько это возможно для этого сценария. Если вы не используете ListView как navigation drawer содержание, то вы можете определить другой макет для другой деятельности, как написано в пункте 1 выше

3. Я думаю Google+ приложение использует ListView как navigation drawer от их custom дизайн. Это зависит от необходимости вашего приложения, либо вы можете пойти с List или вы можете создать simple пользовательские макеты для вашего приложения

Я надеюсь, что мое решение в какой-то степени разрешит ваши сомнения

Вы можете использовать фрагменты и вызывать их из mainActivity так:

MainActivity.java
public class MainActivity extends Activity {
..
..
@Override
protected void onCreate(Bundle savedInstanceState) {
..
mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
}

/**
 * Slide menu item click listener
 * */
private class SlideMenuClickListener implements
        ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        // display view for selected nav drawer item
        displayView(position);
    }
}

 /**
 * Diplaying fragment view for selected nav drawer list item
 * */
private void displayView(int position) {
    // update the main content by replacing fragments
    Fragment fragment = null;
    switch (position) {
    case 0:
        fragment = new HomeFragment();
        break;
    case 1:
        fragment = new FindPeopleFragment();
        break;
    case 2:
        fragment = new PhotosFragment();
        break;
    case 3:
        fragment = new CommunityFragment();
        break;
    case 4:
        fragment = new PagesFragment();
        break;
    case 5:
        fragment = new WhatsHotFragment();
        break;

    default:
        break;
    }

    if (fragment != null) {
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment).commit();

        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        setTitle(navMenuTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }
}

}

Посмотрите этот урок, он может помочь вам больше

Другие вопросы по тегам