Как организовать приложение с помощью фрагментов?

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

Для навигации прямо сейчас у меня есть это раскрывающееся меню, которое при нажатии элемента запускает новую активность:

Введите описание изображения здесь

Активность «Ваша статистика» похожа на домашнюю страницу, в которую пользователь также войдет в приложение. Я также хочу, чтобы пользователь мог вернуться на эту «страницу» из любого места приложения.

Моя активность, которую я планирую запустить ничью, у меня есть макет рисования с именем fragment_main:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <FrameLayout android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" > </FrameLayout> <ListView android:id="@+id/drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="#FFF" android:choiceMode="singleChoice"/> </android.support.v4.widget.DrawerLayout> 

И моя активность, которая загружает макет ящика:

 public class MainDraw extends FragmentActivity { final String[] data ={"one","two","three"}; final String[] fragments ={ "com.beerportfolio.beerportfoliopro.FragmentOne", "com.beerportfolio.beerportfoliopro.FragmentTwo", "com.beerportfolio.beerportfoliopro.FragmentThree"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_main); //todo: load statistics ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActionBar().getThemedContext(), android.R.layout.simple_list_item_1, data); final DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout); final ListView navList = (ListView) findViewById(R.id.drawer); navList.setAdapter(adapter); navList.setOnItemClickListener(new AdapterView.OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, final int pos,long id){ drawer.setDrawerListener( new DrawerLayout.SimpleDrawerListener(){ @Override public void onDrawerClosed(View drawerView){ super.onDrawerClosed(drawerView); FragmentTransaction tx = getSupportFragmentManager().beginTransaction(); tx.replace(R.id.main, Fragment.instantiate(MainDraw.this, fragments[pos])); tx.commit(); } }); drawer.closeDrawer(navList); } }); FragmentTransaction tx = getSupportFragmentManager().beginTransaction(); tx.replace(R.id.main,Fragment.instantiate(MainDraw.this, fragments[0])); tx.commit(); } } 

IN my // todo: comment Я должен загрузить мой первый «домашний» фрагмент, который является моей страницей статистики? И тогда все остальные фрагменты будут переходить и выходить на основе щелчков мыши?

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

Прежде всего, прочитайте хорошо написанную документацию , она ответит на ваши сомнения.

Я бы поделился своим персональным шаблоном, чтобы преобразовать существующий Activity в Fragment

  • Создайте свой абстрактный класс Фрагментов, из которого извлекаются все фрагменты ящика, это может помочь сгруппировать общие атрибуты
  • Используйте метод, подобный selectItem() в документах, он помогает явным делать вызов при первом запуске (показывая фрагмент «home»), а затем из onItemClick
  • Переместите раздувание XML-макета из кода Activity.onCreate() в Fragment.onCreateView() (т.е. setContentView для inflater.inflate(R.layout.my_layout, container, false) , во многих случаях вы можете скопировать весь код из onCreate() в onCreateView
  • Переместите код инициализации из Activity.onCreate() в Fragment.onActivityCreated() , это очень полезно, когда существуют как Activity (включая фрагмент), так и прямой фрагмент, например, если ваше приложение предоставляет действие «Поделиться с», вы по-прежнему имеете Активность, которая внутри XML включает в себя <fragment/> и фрагмент может быть создан из ящика, тоже
  • Если вам нужно связаться с Activity to Fragment и наоборот, я предлагаю создать интерфейс и сохранить его внутри 'onAttach ()' (см. Пример Google)
  • Элементы панели действий должны быть скрыты, когда ящик открыт, снова взгляните на пример, используемый в doc, здесь очень полезен интерфейс для связи от активности до фрагмента, основное действие может определить, открыт ли ящик, и фрагмент может вызвать интерфейс

     public interface FragmentActivityStatus { public boolean isDrawerOpen(); } 

Активность

  public class MainActivity extends Activity implements FragmentActivityStatus { @Override public boolean isDrawerOpen() { return drawerLayout.isDrawerOpen(drawerList); } } 

Фрагмент

  @Override public void onAttach(Activity activity) { super.onAttach(activity); fragmentActivityStatus = (FragmentActivityStatus)activity; } @Override public void onPrepareOptionsMenu(Menu menu) { boolean isMenuVisible = !fragmentActivityStatus.isDrawerOpen(); menu.findItem(R.id.my_menu).setVisible(isMenuVisible); super.onPrepareOptionsMenu(menu); } 

Не связанный с фрагментом, в вашем коде вы объявляете имена классов в виде строки, подумайте о создании массива Class если вы рефакторируете пакеты, код продолжает работать, а затем вы можете вызвать Class.getName() чтобы получить строку для перехода к Fragment.instantiate()

  final Class<?>[] fragments = { FragmentOne.class, FragmentTwo.class, FragmentThree.class}; 

затем

  FragmentTransaction tx = getSupportFragmentManager().beginTransaction(); tx.replace(R.id.main, Fragment.instantiate(MainDraw.this, fragments[pos].getName())); tx.commit();