Навигационный ящик нескольких контейнеров и лучшие практики
Я относительно новичок в разработке 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
меню.
Итак, вот мои вопросы.
- Реальное приложение не имеет только одного взгляда на всю активность. В основном у Activity много разных представлений и несколько фрагментов, чтобы сделать пользовательский интерфейс более отзывчивым и улучшить пользовательский интерфейс. Мои действия - это, конечно, разные взгляды и фрагменты (какова цель этих действий?:)). В одном действии есть только один фрагмент, в другом - несколько фрагментов, поэтому они ВСЕ разные. В предыдущем примере кода ТОЛЬКО ОДИН
FrameLayout
контейнер для хранения фрагмента ТОЛЬКО ОДИН фрагмент, что мне делать, если в моей деятельности есть два, три или более фрагментов? Что является лучшим решением в этом случае. - Как я уже описал, в моем приложении есть несколько действий, поэтому мой Навигационный ящик должен (в соответствии с практиками пользовательского интерфейса Android) работать с каждым действием, чтобы пользователь мог перейти к элементам приложения верхнего уровня. В этом случае лучше иметь один
BaseActivity
(Я прочитал ответы здесь на stackru), который будет содержать все вещи для конфигурацииNavigationDrawer
, Но насколько требуется навигационный ящикDrawerLayout
в XML-макете деятельности,BaseActivity
должен позвонитьsetContentView
метод. И все досталось отBaseActivity
Действия должны выполнить некоторые трюки, чтобы установить свой собственный макет, или нет смысла переопределять этот метод, потому что он сломает всю логику. Что делать в этом случае? - Каков наиболее эффективный способ создания настраиваемого списка ящиков навигации, например, в Google+ или YouTube, без использования сложной иерархии представлений, которая заставляет GPU работать усердно и может принести пользователю плохой опыт
Что касается второй проблемы, у меня есть некоторые идеи, как я могу решить это, но я не знаю, является ли это правильным способом и какой подход лучше.
Первая идея - реализовать шаблон TemplateMethod. Создать метод в BaseActivity
что-то вроде setupCustomViewGroup()
и переопределить его во всех активностях, накачать нужную группу просмотра из XML и вернуть ее из этого метода, а затем использовать ее для надувания целого представления.
Или явно добавьте представление в Activity, используйте merge и включите тег.
Но опять же, это может быть полезно только для всей деятельности или одного фрагмента, что делать, если у нас больше фрагментов, мы используем вложенные фрагменты, я думаю, что это плохая идея.
Кроме того, моя цель - оптимизировать иерархию представлений, чтобы сделать ее быстрой и эффективной, чтобы обеспечить плавность даже на старых устройствах.
Я буду очень-очень признателен всем, кто может описать или предложить наиболее эффективный и правильный способ следовать в этом случае, чтобы сделать пользовательский интерфейс отзывчивым и читаемым кодом.
Спасибо.
3 ответа
1) Миграция из NavigationDrawer в SlideMenu (доступно на github).
2) Убедитесь, что у вашей BaseActivity нет макета вообще.
3) Раздуйте свой элемент списка через ArrayAdapter.
Надеюсь, это поможет.
Решение:
1. Я могу подумать 2 случая здесь:
- Несколько фрагментов, одно действие: в этом случае лучше всего
replace
фрагменты вFrameLayout
content_frame
пока вы переключаетесь между фрагментами.navigation drawer
содержание остается тем же для них - Несколько фрагментов, несколько действий: в этом случае вы должны определить разные
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");
}
}
}
Посмотрите этот урок, он может помочь вам больше